【问题标题】:Sinon usefaketimer an the spy called count miss诗乃使用faketimers和被称为count miss的间谍
【发布时间】:2023-03-29 06:13:01
【问题描述】:

这是我的代码。我想测试“做”方法并验证 this.obj.send 调用计数与时间间隔。

我的问题是当我存根_fetchAllDatas 的方法并解决时。 this.obj.send 无法调用。当this.obj.send 移动到_fetchAllDatas 外面。可以调用。

我该如何处理这个问题?谢谢~

var sinon = require('sinon');


class A {
    constructor(obj){
        this.obj = obj;
        this.timer;
    }

    doing(){
        this.timer = setInterval(()=>{
            this._fetchAllDatas().then((data)=>{
                console.log('!!!',data);
                this.obj.send(data);
            });
        },1000)
    }

    stop(){
        clearInterval(this.timer);
    }

    _fetchAllDatas(){
        return Promise.resolve([]);
    }
}

var sandbox = sinon.sandbox.create();
var spy = { send: sandbox.spy()};
var a = new A(spy);
var stub = sandbox.stub(a,'_fetchAllDatas').resolves(['mark']);
var clock = sandbox.useFakeTimers();

a.doing();;
clock.tick(5000);
 sinon.assert.callCount(spy.send, 5); // error the count is zero. it should be 5 times

【问题讨论】:

    标签: unit-testing sinon


    【解决方案1】:

    首先,"call count = 5 times within 5 seconds" 的结果不会像预期的那样发生。 只是因为setInterval的回调会在N(ms)的延迟时间后触发; 也就是说,它只会在 5 秒内发生四次,如下图所示:

    x = not triggered
    o = triggered
    
    1s--1s--1s--1s--1s
    x   o   o   o   o
    ^start          ^end
    

    其次,您不会在同步调用之后立即从异步调用中获得正确的结果。 当您调用a.doing(); 时,它会启动setInterval 的同步版本(因为useFakeTimers) 这将调用一个函数this._fetchAllDatas() 返回一个运行异步回调的 Promise, 这意味着this.obj.send(data) 将被异步执行。

    即使你使用clock.tick(5000),它仍然是一个异步调用。

    也就是说,您应该在 Promise 真正解决后的正确时间进行断言。

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2013-11-21
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多