我正在尝试为此模块(2)实施测试(1)
我的目的是检查在触发特定事件时是否获取集合
正如您在(2)中的评论中所看到的,我收到了Error: Expected a spy, but got Function.
的消息
该模块有效,但测试失败。有任何想法吗?
(1)
// jasmine test module
describe('When onGivePoints is fired', function () {
beforeEach(function () {
spyOn(this.view.collection, 'restartPolling').andCallThrough();
app.vent.trigger('onGivePoints');
});
it('the board collection should be fetched', function () {
expect(this.view.collection.restartPolling).toHaveBeenCalled();
// Error: Expected a spy, but got Function.
});
});
(2)
// model view module
return Marionette.CompositeView.extend({
initialize: function () {
this.collection = new UserBoardCollection();
this.collection.startPolling();
app.vent.on('onGivePoints', this.collection.restartPolling);
},
// other code
});
答案 0 :(得分:40)
你需要进入实际的方法,在这种情况下是在原型上。
describe('When onGivePoints is fired', function () {
beforeEach(function () {
spyOn(UsersBoardCollection.prototype, 'restartPolling').andCallThrough();
app.vent.trigger('onGivePoints');
});
it('the board collection should be fetched', function () {
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
});
});
当您无法访问想要侦察的实际实例时,对原型进行间谍活动是一个很好的技巧。
答案 1 :(得分:3)
我也遇到了同样的问题,但我通过在函数调用中传递一个参数来解决它。然后你必须在it
var data = {name:"test"}
spyOn(UsersBoardCollection.prototype, "restartPolling").and.callThrough();
UsersBoardCollection.prototype.restartPolling(data);
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
答案 2 :(得分:0)
我有这个错误,因为我有两个版本的sinon加载,或者可能我没有正确初始化sinon-jasmine。当我在我的规范设置中明确加载sinon然后是sinon jasmine时,它开始正常运行。