Как проверить результат функции карри в жасмине? - PullRequest
0 голосов
/ 09 мая 2018

Вариант использования:

  • У меня есть модуль функций, каждая функция проверяется модулем
  • У меня есть фабричная функция, которая создает поток этих функций, который сторонняя библиотекаТребуется.
  • Я хотел бы проверить, что эта фабричная функция производит правильный поток.Используя @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 здесь .

1 Ответ

0 голосов
/ 09 мая 2018

"Этот тест не пройден, поскольку b.bind возвращает новую функцию."

Это потому, что вы получаете от c результат от b.bind(null, arg), который отличается от b.
В противном случае b.bind будет изменяющим b.

Как mdn говорит:

Метод bind() создает новую функцию , которой при вызове присваивается ключевое слово this с заданным значением, причем заданная последовательность аргументов предшествует любому из предоставленных при вызове новой функции.
( источник , акцент мой)

Как правило, 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.

...