sinon.stub()。为每次调用返回指定而不是一次

时间:2017-07-14 22:03:38

标签: javascript testing promise sinon

下面我有一些代码来演示我如何测试/存根一个promise,<div class="toolbar-container"> <div class="search-bar"></div> <div class="filter-group"> <div class="filters"></div> <div class="buttons"></div> </div> </div> .toolbar-container { display: flex; } .search { } .filter-group { display: flex; justify-content: space-between; } .filters { flex-wrap: wrap; } .buttons { } 下面的函数使用了参数promise useSpyPromise。我试图找出如何指定存根以在第一次调用(spyPromise)上返回一个承诺,并在第二次调用时解析另一个承诺(Promise.resolve(['hasLength'])。

Promise.resolve([]

1 个答案:

答案 0 :(得分:0)

很难确切地说出你想要什么,但有一点似乎很确定;提供测试是同步的 - 即。没有进一步的承诺 - 那么你不需要promise1promise2,只需return spyPromise.then(...)

您可能只希望行为完全由d.length决定,在这种情况下,它很简单:

function useSpyPromise(spyPromise) {
    return spyPromise.then(d => {
        if(d.length <= 1) {
            throw new Error('d ' + d.length);
        }
        return d;
    });
}

但是,如果您真的希望将函数调用的次数考虑在内,那么可能是这样的:

var count = 0;
function useSpyPromise(spyPromise) {
    count += 1;
    return spyPromise.then(d => {
        if(count === 0 && d.length === 0) {
            throw new Error('d 0');
        if(count === 1 && d.length === 1) {
            throw new Error('d ' + d.length);
        }
        return d;
    });
}

这是一个非常奇怪的事情,但也许它是你的应用程序所需要的。我不能告诉你。

无论哪种方式,这都不是故事的结局。您可以通过多种方式制定测试。例如,count > 1条件应该抛出?这个问题并没有这么说,但你考虑过那些案例吗?

您所写的内容取决于您想要的确切行为。