Mocha使用.then

时间:2017-08-24 14:34:10

标签: javascript ajax testing mocha sinon

我有一个jquery ajax调用看起来像这样:

$.ajax({
  type: "GET",
  dataType: 'json',
  data: data,
  url: url
}).then((data, successFlag, xhr) => {
  this.props.someFunc(data)
})

在我的测试文件中,我使用了sinon的jquery ajax调用,它返回一个已解析的数据承诺:

sinon.stub($, 'ajax')
  .returns(Promise.resolve({ data: 'test data' }))

我也在监视我的someFunc(数据)功能。在我的测试中,我调用了一个进行ajax调用的函数,然后期望调用我的someFunc(数据)。但是,期望失败,但是当我在我的someFunc(数据)函数中放入控制台日志时,我可以看到它显然被调用:

component.instance().makeAjaxCall()
expect($.ajax.calledOnce).to.be.true // passes
expect(someFuncSpy.calledOnce).to.be.true // fails

现在我认为它失败了,因为它在那之前检查了期望。然后执行,我尝试查找一些处理承诺测试的解决方案,但到目前为止我没有尝试过任何工作(或者我实施错了)。在检查期望之前,如何确保.then完成执行?

3 个答案:

答案 0 :(得分:0)

您应该在ajax Promise上“注册”,并将您的期望放在then区块中。

类似的东西,

component.instance().makeAjaxCall().then(() => {
    expect($.ajax.calledOnce).to.be.true;
    expect(someFuncSpy.calledOnce).to.be.true;
});

它不适合你,因为Promise在微任务队列上注册了一个回调,并且它在下一个滴答中运行。

答案 1 :(得分:0)

输入sinon的优秀模拟工具sinon.createFakeServer();http://sinonjs.org/releases/v4.1.2/fake-xhr-and-server/

为测试设置模拟和假服务器,调用该函数,告诉假服务器响应,然后检查期望。

在这种情况下,例如:

it('should call someFunc with the expected data', function () {
    var server = sinon.createFakeServer();
    server.respondWith("GET", "*",
            [200, { "Content-Type": "application/json" },
             '[{ "id": 12, "comment": "Hey there" }]']);
    var comp = component.instance();
    var testStub = sinon.stub(comp.props, 'someFunc');
    comp.makeAjaxCall();
    this.server.respond();

    expect(testStub.calledOnce).to.be.true; // You should consider the sinon-chai package for nicer assertion debugging
    testStub.restore();
    server.restore();
}

就个人而言,我喜欢能够传入模拟的依赖项,因为我发现它更可测试(例如,将$ .ajax传递给构造函数,存储为实例上的ajaxService参数)。

答案 2 :(得分:0)

在调用存根方法后使用 done()

it('should make an ajax call', function(done) {
    sinon.stub($, 'ajax').returns(Promise.resolve({ data: 'test data' }))
    component.instance().makeAjaxCall()
    expect($.ajax.calledOnce).to.be.true;
    done(); // let Mocha know we're done async testing

    expect(someFuncSpy.calledOnce).to.be.true;
});

注意:请在函数中将完成作为参数传递给它-((),函数(完成) {})

Source