【发布时间】:2018-05-09 13:58:38
【问题描述】:
用例:
- 我有一个功能模块,每个功能都经过单元测试
- 我有一个工厂函数,可以创建第三方库所需的这些函数的流。
- 我想测试这个工厂函数是否产生了正确的流。使用
@cycle/Time,我可以创建流并在流上断言。 - 我能够断言函数以正确的顺序出现在流中。
- 但是,我无法断言任何已被柯里化的函数。如何断言柯里化函数?
- 目前,我对
JSON.stringify函数进行了破解,并在其源代码上断言。
为了简化问题,我创建了一个简单的测试套件,因此我们不关心使用@cycle/Time。看来柯里化函数是该函数的新实例。请看下面的代码。
我想知道如何才能使失败的测试通过?在这种情况下,我使用bind 来模拟柯里化函数。这可能吗?
const a = () => b
const b = () => {}
const c = (arg) => b.bind(null, arg)
const d = () => () => {}
describe("curried function test", function() {
it('should return a reference to b', () => {
expect(a()).toBe(b)
})
// This test fails because b.bind returns a new function.
it('should return a reference to a curried b', () => {
expect(c('foo')).toBe(b)
})
it('should create a new instance everytime', () => {
expect(d()).not.toBe(d())
})
});
我已经设置了一个 jsfiddle here。
【问题讨论】:
-
测试行为 - 你希望结果做什么?
-
不幸的是,函数存在于流中,但我想我可以用测试数据映射函数......但这似乎是间接的。
-
“此测试失败,因为 b.bind 返回了一个新函数。” > 是的,那是因为你得到的是来自
bind的结果,而不是与b相同。否则,b.bind将修改b。
标签: javascript unit-testing ecmascript-6 jasmine cycle