Как работают библиотеки утверждений, такие как Chai, без принудительного вызова функции?

В Chai вы можете сделать следующее:

expect({}).to.exist;

exist не является вызовом функции, но это все еще работает в тестовых средах. Противоположность (expect({}).to.not.exist) заставляет тесты сбой, но опять же, exist не является вызовом функции.

Как эти утверждения работают, не заставляя меня вызывать функцию? На самом деле, если я попытаюсь сказать expect({}).to.exist(), тест завершится неудачно, потому что exist не является функцией.

Ответ 1

Я понял это (или, по крайней мере, понял метод). Используйте JavaScript getters:

var throws = {
  get a() {
    throw new Error('a');
  },
  get b() {
    throw new Error('b');
  },
  get c() {
    throw new Error('c');
  }
};

При выполнении throws.a, throws.b или throws.c будет выбрана соответствующая ошибка.

С этой точки довольно легко построить утверждения, которые содержатся в Chai.