2016-06-07 5 views
3

Ich baue eine Anwendung, in der ich testen muss, dass eine Callback-Funktion in der Auflösung des Versprechens aufgerufen wurde.Testen Sie, dass eine Funktion in einer Verheißungsauflösung aufgerufen wird

Eigentlich habe ich den folgenden Code:

const callbackRender = (httpResponse, response) => { 
    if (httpResponse.content.content) response.send(httpResponse.content.content) 
    else response.render(httpResponse.content.page) 
} 

const callback = (injector, route) => { 
    return (request, response) => { 
    const ctrl = injector.get(route.controller) 
    const result = ctrl[route.controllerMethod](new HttpRequest()) 
    if (result.then) { 
     result.then(res => { 
     console.log('hey I m in !') 
     callbackRender(res, response) 
     }) 
    } else { 
     callbackRender(result, response) 
    } 
    } 
} 

ich, dass die

result.then(res => { 
     console.log('hey I m in !') 
     callbackRender(res, response) 
     }) 

gut testen müssen aufgerufen.

Ich habe diesen Test geschrieben mit Mokka und chai, und ich bin mit immer 0 Mal Spion Anrufe:

it('should call the callback render method when httpResponse is a promise', (done) => { 
     const mock = sinon.mock(injector) 
     const ctrl = new UserControllerMock() 
     const routes = routeParser.parseRoutes() 
     mock.expects('get').returns(ctrl) 
     const spy = chai.spy(callbackRender) 
     callback(injector, routes[3])(request, response) 
     setTimeout(() => { 
     expect(spy).to.have.been.called.once 
     mock.verify() 
     mock.restore() 
     done() 
     }, 0) 
    }) 

NB: Die Log-Nachricht in dem Teil Versprechen lösen, wenn auch genannt wird, und ich kann es angezeigt werden auf dem Bildschirm.

Irgendeine Idee?

+2

Asynchroner Code muss asynchron getestet werden. –

+0

Genau was ich mit setTimeout gemacht habe: o – mfrachet

+0

Nicht ganz ... 'setTimeout' wird dir hier nicht helfen (zumindest nicht vorhersehbar). Ihr Test muss [auf das aufgelöste Versprechen warten] (http://chaijs.com/plugins/chai-as-promised/), bevor er seine 'expect'-Anweisung überprüft. –

Antwort

1

Geben Sie Ihre Antwort zurück, dann können Sie in Ihrem Test then aufrufen.

const callback = (injector, route) => { 
    return (request, response) => { 
    const ctrl = injector.get(route.controller) 
    const result = ctrl[route.controllerMethod](new HttpRequest()) 
    if (result.then) { 
     return result.then(res => { 
     callbackRender(res, response) 
     }); 
    } else { 
     return Promise.resolve(callbackRender(result, response)); 
    } 
    } 
} 

Ihr Test:

it('should call the callback render method when httpResponse is a promise', (done) => { 
     const mock = sinon.mock(injector) 
     const ctrl = new UserControllerMock() 
     const routes = routeParser.parseRoutes() 
     mock.expects('get').returns(ctrl) 
     const spy = chai.spy(callbackRender) 
     callback(injector, routes[3])(request, response).then(() => { 
      expect(spy).to.have.been.called.once 
      mock.verify() 
      mock.restore() 
      done() 
     }); 
    }); 

Obwohl, Sie scheinen nicht callbackRender zu injizieren, so könnte Ihr Spion noch nicht aufgerufen.

+0

Mein Kontext ist ein bisschen breiter, kann ich kein Versprechen zurückgeben, weil der Rückruf Sie mit der Anfrage, Antwort-Parameter sehen (Zeile 2) ist in der Tat ein Express-Web-Server Rückrufen. Es werden keine Versprechen gehalten. Aber danke für die Antwort :) – mfrachet

+0

Ich verstehe nicht, warum Sie das Versprechen nicht zurückgeben können, ich gebe Versprechen in Expresshandlern oft zurück. Ohne es ist Ihre einzige Option, ein längeres Timeout festzulegen, aber das ist fehleranfällig. – Lee

+0

Ich werde diese Lösung thx ausprobieren – mfrachet