在尝试模拟对象的实例时,Sinon存根不起作用

时间:2017-02-08 20:46:08

标签: javascript unit-testing sinon karma-mocha

我正在尝试模拟使用对象的 new 关键字创建的每个实例。

这是我试图嘲笑的对象:

var SharedWhiteboardView = function(moduleEl, domService) {
'use strict';

var self;
var sharedWhiteboardProblemImage;
var whiteboardController;
var caller = false;
var toolbarController;

return {
    initWhiteboard : function()
    {
        self = this;
        sharedWhiteboardProblemImage = domService.find(moduleEl, '#sharedWhiteboardModule-sharedWhiteboardProblemImage');

        var toolbarEL = $('#sharedWhiteboard-toolbar');
        toolbarController = new ToolbarController(WhiteboardConstants.SHARED_WHITEBOARD_ID, toolbarEL, null);
        toolbarController.init(false);
        whiteboardController = toolbarController.getWhiteboardController();
    },

    enableWhiteboardEdition : function(enabled)
    {
        if(self.getWhiteboardObject() && self.getWhiteboardObject.hasOwnProperty('enableEdition')) self.getWhiteboardObject().enableEdition(enabled);
        whiteboardController.setEnabled(enabled);
    }
  };
}

这是我试图测试的文件,它创建了上述对象的新实例

Box.Application.addModule('SharedWhiteboardModule', function(context) {
'use strict';

var self;
var moduleEl;
var domService;
var sharedWhiteboardView;
var modal;
var assignmentTimer = 3000;
var sharing = false;
var assignmentImageData = '';

return {
    /**
     * Initializes the module and caches the module element
     * @returns {void}
     */
    init: function() {
        self = this;
        domService = context.getService('DomService');
        moduleEl = context.getElement();
        sharedWhiteboardView = new SharedWhiteboardView(moduleEl, domService);
        sharedWhiteboardView.initWhiteboard();
        sharedWhiteboardView.enableWhiteboardEdition(false);
  };
}

我正在尝试编写一个单元测试来测试使用'false'调用sharedWhiteboardView.enableWhiteboardEdition方法

但是我没有附加间谍或存根该方法。我尝试过这些解决方案并且无法正常工作

//第一次尝试

  sinon.stub(SharedWhiteboardView, "enableWhiteboardEdition", function() {return 0})

//第二次尝试

 sinon.stub(SharedWhiteboardView.prototype, "enableWhiteboardEdition").returns(0);

//第三次尝试

sandbox.stub(SharedWhiteboardView.prototype, 'enableWhiteboardEdition', checkEnableWhiteboardEdition());

//第四次尝试尝试chrmod提供的答案

it.only('when type is "SharedWhiteboardModule-setEditable" should call sharedWhiteboardView.enableWhiteboardEdition', function (done) {
  const view = SharedWhiteboardView();
  sinon.stub(view, "enableWhiteboardEdition", function() {
    console.log('Hit');
  });
  module.onmessage('SharedWhiteboardModule-setEditable', true);
  done();
});

没有错误,但它没有命中console.log,我删除了'new'关键字

我得到的错误:

-Attempted将undefined属性enableWhiteboardEdition包装为函数 -Cannot stub不存在自己的属性enableWhiteboardEdition

请任何帮助都会很棒。我在这里走到了尽头。

这是一个codepen:http://codepen.io/anon/pen/bgmNxx?editors=0011

我所要做的就是在我的模块调用enableEdition

时让Fake方法被击中

2 个答案:

答案 0 :(得分:0)

SharedWhiteboardView不是构造函数,而是工厂函数。一旦被调用(没有新的),它将返回具有enableWhiteboardEdition作为自己属性的新对象。

因此必须在该对象上设置存根: const view = SharedWhiteboardView(); sinon.stub(view, "enableWhiteboardEdition", function() {return 0});

答案 1 :(得分:0)

it('when type is "SharedWhiteboardModule-setEditable" should call setEditable with appropriate callback', function (done) {
var mockSharedWhiteboardView = {
    enableWhiteboardEdition: function() {},
    initWhiteboard: function() {},
    initScrollBar: function() {},
    refreshScrollBar: function() {},
    isMainWhiteboardAvailable: function() {}
};
sandbox.spy(mockSharedWhiteboardView, 'enableWhiteboardEdition');

var tempGlobals = {
    SharedWhiteboardView: global.SharedWhiteboardView
};

global.SharedWhiteboardView = function() {
    return mockSharedWhiteboardView;
};

module = Box.Application.getModuleForTest('SharedWhiteboardModule', contextFake);
module.init();

var shouldEnable = true;
module.onmessage('SharedWhiteboardModule-setEditable', shouldEnable);
assert(mockSharedWhiteboardView.enableWhiteboardEdition.calledWithExactly(shouldEnable),
       'should enable the whiteboard');

shouldEnable = false;
module.onmessage('SharedWhiteboardModule-setEditable', shouldEnable);
assert(mockSharedWhiteboardView.enableWhiteboardEdition.calledWithExactly(shouldEnable),
       'should not enable the whiteboard');

// cleanup
global.SharedWhiteboardView = tempGlobals.SharedWhiteboardView;

done();

});

这样做了