Используйте sinon.js для создания «шпионского объекта» с шпионскими методами, основанными на реальном конструкторе / прототипе

Я использую sinon.js как способ заглушить зависимости в моих тестах Mocha. Я предпочитаю «шпион» подход по сравнению с классическим фиктивным подходом, так как самоанализ шпиона кажется более ясным и дает больше гибкости, чем несколько отсталый взгляд с классическими фиктивными объектами.

Тем не менее, мне интересно, правильно ли я его использую, когда речь идет о создании тестовых шпионов для целых объектов. Допустим, у меня есть тестовая зависимость, в которой есть 4 метода, и я хочу заглушить каждый из этих методов и сделать утверждения для одного или двух из них. В настоящее время я делаю это:

var spyObj = {
  aMethod: sinon.spy(),
  otherMethod: sinon.spy(),
  whatever: sinon.spy()
};

Тогда я просто спрашиваю такие вещи, какspyObj.aMethod.calledWith(a, b, c).

Есть ли лучший способ макетировать целый класс, чем повторять имена методов в самом наборе тестов? Похоже, что sinon.stub () пытается перебрать все члены данного объекта, но это не похоже на способ получения всех методов для большинства объектов в более современных средах выполнения JS, таких как V8, если только объект на самом деле что-то перечисляемое. Он также пытается обезопасить фактический объект, вместо того, чтобы возвращать эквивалентный, что несколько нежелательно. Мне просто нужен объект, который соответствует интерфейсу, но ведет себя как нулевой объект, если я не скажу иначе.

Было бы хорошо иметь возможность сделать что-то вроде:

var spyObject = sinon.spy(MyClass.prototype);

Как найти все методы конструктора / прототипа в Node.js, чтобы сделать обертку, подобную приведенной выше?

Это больше о заглушении логики, чем о тестировании вызовов на множестве методов (которые я пытаюсь ограничить одним или одним нажатием двух). Например, вещи, которые могут выполнять нежелательные операции ввода-вывода или требовать дополнительных сложных приспособлений при их выполнении.

Ответы на вопрос(2)

Ваш ответ на вопрос