请考虑以下示例:
// saveThings.js
import * as services from './services';
export default (a, b) => {
return {
aSaved: services.save(a),
bSaved: services.save(b)
};
};
和测试:
// test.js
import * as services from './services';
import saveThings from './saveThings';
jest.mock('./services');
test('saves things', () => {
services.save.mockReturnValueOnce(true)
services.save.mockReturnValueOnce(false)
const result = saveThings(1, 2)
expect(result).toEqual({aSaved: true, bSaved: false})
expect(services.save).toHaveBeenCalledWith(1)
expect(services.save).toHaveBeenCalledWith(2)
});
这完成了工作,它验证了我期望的值并进行了正确的服务调用。
但是,它遭受了悲剧性的缺陷。我不小心在代码和测试之间引入了时间依赖性。该测试要求代码调用以特定顺序保存在a
和b
上。但是,如您所见,这并不重要。如果顺序更改,该功能仍可按预期运行,但测试会中断。
这是一个超规格,会导致脆弱,这是测试随时间推移而腐烂的主要原因。
有没有办法用Jest处理这个问题?使用sinon可以在定义期望时指定参数。有没有办法在Jest中做类似的事情?
我找到了答案。为此创建了jest-when
。 API就像:
jest-when