Шутка: ожидать или expect … не на основе логического

#jestjs

#jestjs

Вопрос:

Используя test.each в шутку, я хотел бы передать логическое значение, которое определяет, ожидаю я чего-то или нет.

Это тип повторяющегося кода, которого я пытаюсь избежать:

 if (expectFoo) {
  expect(anObject).toContainEqual(
    expect.objectContaining({
      name: "foo"
    })
  );
} else {
  expect(anObject).not.toContainEqual(
    expect.objectContaining({
      name: "foo"
    })
  );
}
  

Вот некоторый псевдокод, который иллюстрирует мой предпочтительный (более чистый, короткий) подход:

 expect(anObject).yesOrNo(expectFoo).toContainEqual(
  expect.objectContaining({
    name: "foo"
  })
);
  

Есть ли что-нибудь подобное в Jest?

Комментарии:

1. Это относится к пользовательскому сопоставителю.

2. Хорошо, но я действительно не хочу перестраивать сопоставители шутки OOTB, такие как .toContainEqual() , objectContaining() и т.д. С нуля. Я не совсем уверен, как написать пользовательскую замену для чего-то подобного, not которая находится между expect() и другим сопоставителем. Можно ли это сделать?

3. Не заметил комментарий. Вот пример, на случай, если он все еще актуален.

Ответ №1:

Встроенные средства сопоставления не являются общедоступным API, но могут быть импортированы из того же внутреннего модуля, который используется Jest:

 import matchers from 'expect/build/matchers';
  

Пользовательские средства сопоставления могут переносить и составлять встроенные средства сопоставления:

 expect.extend({
  toContainFoo(received, expectFoo = true) {
    const isNot = !expectFoo ? !this.isNot : this.isNot
    this.isNot = isNot; // affects error message
    const expected = matchers.objectContaining({
      name: "foo"
    });
    const result = matchers.toContainEqual.call(this, received, expected);
    result.pass = !isNot; // affects assertion logic
    return resu<
  }
})
  

Комментарии:

1. Это не совсем то, на что я надеялся, поскольку вы должны реализовать это отдельно для каждого средства сопоставления или комбинации средств сопоставления. Было бы неплохо иметь что-то вроде универсальной not замены, которая принимает логический параметр. Но это, безусловно, лучше, чем необходимость перестраивать логику самих сопоставителей. Спасибо!