2

私が書いたいくつかのコードの単体テストを作成しようとしています。私が直面している問題は、関数の実行後にモックコールバックが呼び出されることを期待していますが、呼び出されないためテストが失敗することです。

describe("Asynchronous specs", function() {

    var mockNext;

    beforeEach(function() {
        mockNext = jasmine.createSpy('mockNext');
        var res;
       parallelRequests.APICall(testObject[0], null, mockNext);
    });

    it("callback spy should be called", function () {
        expect(mockNext).toHaveBeenCalled();
    });
});

テストされる関数は非常に単純です。

function APICall(options, res, next) {
        request(options, callback);
        function callback(error, response, body) {
        if (error) {
            if (error.code === 'ETIMEDOUT') {
                return logger.error('request timed out: ', error);
                 next(error);
            }
            logger.error('request failed: ', error);
            next(error);
        }
        next(null);
    }
}

私が疑う問題は、リクエストの非同期の性質のために API 呼び出しでモック コールバックが実行される前に、jasmine が期待をテストしていることです。done() とフラグの使用について他の人が提案しているものを使用してみましたが、うまくいきませんでした。この問題についてのガイダンスをいただければ幸いです。

4

1 に答える 1

3

あなたのbeforeEachコードは非同期です。beforeEachロジックが完了したら、yasmin に通知する必要があります。doneこれは、各テストに渡されるコールバック メソッドによって解決できます。これを試して:

describe("Asynchronous specs", function() {

    var mockNext;        

    beforeEach(function(done) {

        parallelRequests.APICall(testObject[0], null, function(){
            mockNext = jasmine.createSpy('mockNext');
            mockNext();
            done();
        });
    });

    it("callback spy should be called", function () {
        expect(mockNext).toHaveBeenCalled();
    });
});
于 2016-08-16T22:42:32.213 に答える