Преамбула: я читал много сообщений SO и в блогах, но ничего не видел, чтобы ответить на этот конкретный вопрос. Может быть, я просто искал неправильную вещь...
Предположим, что я разрабатываю класс WidgetManager
, который будет работать с объектами Widget
.
Как использовать sinon для проверки того, что WidgetManager правильно использует API Widget
, не втягивая всю библиотеку Widget
?
Обоснование: тесты для WidgetManager должны быть отделены от класса Widget. Возможно, я еще не написал Widget, или, возможно, Widget - это внешняя библиотека. В любом случае, я должен проверить, что WidgetManager правильно использует Widget API без создания реальных виджетов.
Я знаю, что синонные издевки могут работать только на существующих классах, и, насколько я могу судить, синусные заглушки также нуждаются в существовании класса, прежде чем его можно будет опустить.
Чтобы сделать его конкретным, как бы я мог проверить, что Widget.create()
получает точно один раз с единственным аргументом "имя" в следующем коде?
проверенный код
// file: widget-manager.js
function WidgetManager() {
this.widgets = []
}
WidgetManager.prototype.addWidget = function(name) {
this.widgets.push(Widget.create(name));
}
код тестирования
// file: widget-manager-test.js
var WidgetManager = require('../lib/widget-manager.js')
var sinon = require('sinon');
describe('WidgetManager', function() {
describe('#addWidget', function() {
it('should call Widget.create with the correct name', function() {
var widget_manager = new WidgetManager();
// what goes here?
});
it('should push one widget onto the widgets list', function() {
var widget_manager = new WidgetManager();
// what setup goes here?
widget_manager.addWidget('fred');
expect(widget_manager.widgets.length).to.equal(1);
});
});
Помимо этого: Конечно, я мог бы определить класс MockWidget
для тестирования с помощью соответствующих методов, но мне больше интересно узнать, как правильно использовать функции sinon spy/stub/mock.