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