2017-06-07 3 views
0

Ich schreibe einen Test mit Scherz, um eine meiner Middleware zu testen.Wie behauptet man dieses Versprechen über den Scherz?

const asyncAll = (req, res, next) => { 
    const queue = [ 
     service.exchangeLongTimeToken(req), 
     service.retrieveUserInfo(req), 
    ]; 
    Promise.all(queue).then((values) => { 
     res.locals.auth = values[0]; 
     res.locals.user = values[1]; 
     next(); 
    }).catch((err) => { 
     next(err) 
    }); 
}; 

Die Testdatei ist wie folgt:

const httpMocks = require('node-mocks-http'); 
const testData = require('../../testdata/data.json'); 

describe('Test asyncAll',() => { 
    let spy1 = {}; 
    let spy2 = {}; 
    const mockNext = jest.fn(); 

    afterEach(() => { 
     mockNext.mockReset(); 
     spy1.mockRestore(); 
     spy2.mockRestore(); 
    }); 

    test('Should call next() with no error when no error with 2 requests',() => { 
     spy1 = jest.spyOn(service, 'exchangeLongTimeToken').mockImplementation((url) => { 
      return Promise.resolve(testData.fbLongTimeToken); 
     }); 

     spy2 = jest.spyOn(service, 'retrieveUserInfo').mockImplementation((url) => { 
      return Promise.resolve(testData.fbUserInfo); 
     }); 

     const request = httpMocks.createRequest(); 
     const response = httpMocks.createResponse(); 

     asyncAll(request, response, mockNext); 

     expect(spy1).toBeCalled(); 
     expect(spy2).toBeCalled(); 
     expect(mockNext).toBeCalled(); 
     expect(mockNext).toBeCalledWith(); 
     expect(mockNext.mock.calls.length).toBe(1); 
    }); 
} 

Der Fehler ist wie folgt:

Error: expect(jest.fn()).toBeCalled()

Expected mock function to have been called.

at Object.<anonymous> (tests/backend/unit/fblogin/asyncAll.test.js:39:26) 

die die Linie widerspiegelt:

expect(mockNext).toBeCalled(); 

Warum es doesn Werde ich angerufen? Ich lese die Dokumente über Scherz, es heißt, ich muss das Versprechen zurückgeben, um den Wert zu testen. Aber die asyncAll() gibt kein Versprechen zurück, stattdessen verbraucht es ein Versprechen, wie man damit umgeht?

Antwort

0

Sie haben Jest über die Versprechen, die Sie in dem Test erstellen zu informieren, haben einen Blick auf die docs zu diesem Thema:

test('Should call next() with no error when no error with 2 requests', async() => { 
     const p1 = Promise.resolve(testData.fbLongTimeToken); 
     const p2 = Promise.resolve(testData.fbUserInfo); 
     spy1 = jest.spyOn(service, 'exchangeLongTimeToken').mockImplementation((url) => { 
      return p1 
     }); 

     spy2 = jest.spyOn(service, 'retrieveUserInfo').mockImplementation((url) => { 
      return p2 
     }); 

     const request = httpMocks.createRequest(); 
     const response = httpMocks.createResponse(); 

     asyncAll(request, response, mockNext); 
     await Promise.all([p1,p2]) 
     expect(spy1).toBeCalled(); 
     expect(spy2).toBeCalled(); 
     expect(mockNext).toBeCalled(); 
     expect(mockNext).toBeCalledWith(); 
     expect(mockNext.mock.calls.length).toBe(1); 
    }); 
+0

Es funktioniert. Aber sollte das nicht wie ein Hack .... ich meine, die gleiche Logik nochmal ausführen um sicherzustellen, dass, wenn ich behaupte, die Werte schon da sind ... –

+0

In JavaScript gibt es nur einen Thread, also wenn du 'then dann rufst ', das wird nicht sofort ausgeführt, sondern nachdem der eigentliche Stapel fertig ist. In unserem Fall führen Sie den Testcode aus, aber der 'promise.then'-Callback wird danach aufgerufen. https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/ –

+0

Vielen Dank! Verstanden! Und durch deine Antwort habe ich herausgefunden, wie man den Fall Promise.reject testet. –

Verwandte Themen