在承诺解决后使用Sinon进行测试

时间:2017-05-14 20:58:44

标签: javascript promise mocking sinon spy

我有一些代码在承诺解决后执行。我试图窥探一个应该在承诺解决后调用的方法,但是我在调​​用spied on方法之前完成执行时遇到问题。

如何测试storage.add的来电实际上是在制作?

以下是测试:

"it marks true in storage": function() {
    sinonSandbox.stub(tested, "updateServiceApi", function() {
        return MPromise.resolve();
    });

    var storageStub = sinonSandbox.stub(storage, "add");

    tested._execute();

    expect(
        storageStub.calledWith("name", true)
    ).to.be.true
}

以下是实施:

_execute: function() {
    this.updateServiceApi().then(function(){
        // tests finish before this code is executed :(
        storage.add("name", true);
    });
},

1 个答案:

答案 0 :(得分:0)

这里的问题是您已经编写了测试,好像_execute是同步的。

由于承诺,expect来电将在storage.add()来电之前执行。

你究竟如何处理这个问题将取决于测试运行,但一般的解决方法是在测试中为被调用的函数添加.then(),其中包含expect代码。

"it marks true in storage": function() {
    sinonSandbox.stub(tested, "updateServiceApi", function() {
        return MPromise.resolve();
    });

    var storageStub = sinonSandbox.stub(storage, "add");

    return tested._execute()
        .then(() => {
             expect(storageStub.calledWith("name", true)).to.be.true;
        });
}