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 调用中执行模拟回调之前,茉莉花测试了预期。我尝试过使用其他人建议使用 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 回答