【问题标题】:How to test the result of a curried function in Jasmine?如何在 Jasmine 中测试柯里化函数的结果?
【发布时间】: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


【解决方案1】:

“此测试失败,因为b.bind 返回了一个新函数。”

那是因为你从c 得到的是从b.bind(null, arg) 得到的结果,这与b 不同。
否则,b.bind修改 b

正如 mdn 所说:

bind() 方法创建一个新函数,在调用该函数时,将其 this 关键字设置为提供的值,并在调用新函数时提供的任何参数之前具有给定的参数序列。
source,强调我的)

基本上,c不能返回对b的引用。

的,是结果函数的名字:

const b = () => {};
const c = (arg) => b.bind(null, arg);

const e = c("foo");

console.log(e.name);
console.log(e.name === `bound ${b.name}`);

因此,您可以测试 e.name 等于 "bound " + b.name

【讨论】:

  • 这看起来很有希望......因为我已经对各个函数进行了单元测试,我想我真的只关心适当的函数按名称按预期顺序出现在流中。优雅的解决方案。
  • @Pete:小心点,我不知道不同的浏览器在这方面是如何工作的。我不确定这是多么标准化。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 2016-01-01
  • 2020-08-05
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多