我正在尝试从具有箭头函数的redux断言一个动作,并且鉴于它创建了一个新的引用,我无法使用chai断言它。
这是代码:
export function save(product) {
return {
types: ['REQUEST', 'SUCCESS', 'FAILED'],
callAPI: () => fetchSomething()
payload: {
product
}
};
}
export function saveOrUpdate(product) {
return product.id ? update(product) : save(product);
}
我试图在我的测试中做这样的事情:
const action = saveOrUpdate(product);
expect(action).to.be.eql(save(product));
由于 callAPI 属性,这不起作用,所以我使用 chai-subset 尝试了这种方法,忽略了属性 callAPI,但它感觉像黑客:
const action = saveOrUpdate(product);
const {types, payload} = save(product);
expect(action).to.containSubset({
types,
payload
});
无论如何可以使用第一种方法断言吗?
谢谢!!
正如你所发现的,每次调用save
函数时,你都有代码的方式,JavaScript虚拟机必须创建一个新的Function
实例。您可以将其替换为对单个函数的引用,该函数是一劳永逸地创建并重用的。这将使相等性测试变得微不足道。
如果你担心callAPI
被用糟糕的论点来称呼,你可以像我在这里所做的那样包装fetchSomething
;
function callFetchSomething() {
fetchSomething();
}
export function save(product) {
return {
types: ['REQUEST', 'SUCCESS', 'FAILED'],
callAPI: callFetchSomething,
payload: {
product
}
};
}
如果您不需要防止错误呼叫,那么您可以拥有 callAPI: fetchSomething
.
我认为您可以使用柴间谍来检查是否调用了save
方法。
var spy = chai.spy(save);
const action = saveOrUpdate(product);
expect(spy).to.have.been.called();