javascript – 使用不可变数据结构时,Jest模拟函数参数不匹配
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用不可变数据结构时,Jest模拟函数参数不匹配,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1584字,纯文字阅读大概需要3分钟。
内容图文
当尝试使用Jest的.toHaveBeenCalledWith()方法测试传递给函数的参数时,如果我使用ImmutableJS库处理不可变数据结构,则测试失败.测试失败,消息类似于:
Expected mock function to have been called with:
[{"foo": true, "bar": "baz"}]
But it was called with:
[{"foo": true, "bar": "baz"}]
测试看起来类似于:
const expectedArgs = Map({
foo: true,
bar: 'baz'
});
const foo = jest.fn();
bar();
expect(foo).toHaveBeenCalledWith(expectedArgs);
和类似的功能:
const bar = () => {
const baz = Map({});
const bazModified = baz.set('foo', true).set('bar', 'baz');
foo(bazModified);
}
我意识到如果我以这种方式传递参数一切正常:
const bar = () => {
const baz = Map({
foo: true,
bar: 'baz'
});
foo(baz);
}
问题是这是我的函数逻辑的一个很大的简化,我必须使用.set来构造对象.有没有人知道为什么.set的方法无法正确评估?
解决方法:
所以你的测试失败了因为toHaveBeenCalledWith只有在实体的实例完全相同的情况下才会通过.它类似于以下内容,但也失败了:
const expectedArgs = Map({
foo: true,
bar: 'baz'
});
const input = Map({
foo: false,
bar: 'baz'
});
const result = input.set('foo', true);
expect(result).toBe(expectedArgs);
另一方面,这确实有效:
expect(result).toEqual(expectedArgs);
因为这表现得非常平等.
你无法用toHaveBeenCalledWith测试相等性,因为baz.set(‘foo’,true)将始终返回一个新实例(这是使用不可变数据的点).
我不认为有办法让toHaveBeenCalledWith表现得像toEqual,所以我想要走的路是用toEqual手动测试模拟调用:
const expectedArgs = Map({
foo: true,
bar: 'baz'
});
const foo = jest.fn();
bar();
// foo.mock.calls[0][0] returns the first argument of the first call to foo
expect(foo.mock.calls[0][0]).toEqual(expectedArgs);
请参阅toBe,toEqual和mock calls上的文档
内容总结
以上是互联网集市为您收集整理的javascript – 使用不可变数据结构时,Jest模拟函数参数不匹配全部内容,希望文章能够帮你解决javascript – 使用不可变数据结构时,Jest模拟函数参数不匹配所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。