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

Javascript 尝试模拟对象实例时,Sinon存根不起作用,javascript,unit-testing,sinon,karma-mocha,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 { initWhitebo

我试图模拟使用对象的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);
  };
}
我正在尝试编写一个单元测试来测试SharedHiteBoardView.enableWhiteboardEdition方法是否使用“false”调用

然而,我没有附上一个间谍或存根的方法了。我尝试过这些解决方案,但都不起作用

//第一次尝试

  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'关键字

我得到的错误:

-试图将未定义的属性enableWhiteboardEdition包装为函数 -无法存根不存在的自有属性enableWhiteboardEdition

求求你,任何帮助都会很好。我在这里走到了死胡同

这是一个密码笔:


我所要做的就是,当我的模块调用enableEdition时,让假方法被命中。SharedHiteBoardView不是构造函数,而是工厂函数。调用后(不带new),它将返回新对象,该对象将
enableWhiteboardEdition
作为自己的属性

因此,必须在该对象上设置存根:

const view=SharedHiteBoardView();
stub(视图,“enableWhiteboardEdition”,函数(){return 0});

SharedHiteBoardView
不是构造函数,而是工厂函数。调用后(不带new),它将返回新对象,该对象将
enableWhiteboardEdition
作为自己的属性

因此,必须在该对象上设置存根:

const view=SharedHiteBoardView();
stub(视图,“enableWhiteboardEdition”,函数(){return 0});

就是这样

it('当类型为“SharedHiteBoardModule setEditable”时,应使用适当的回调函数调用setEditable',函数(完成){
var mockSharedHiteBoardView={
enableWhiteboardEdition:函数(){},
initWhiteboard:function(){},
initScrollBar:function(){},
刷新滚动条:函数(){},
isMainWhiteboardAvailable:函数(){}
};
spy(mockSharedHiteBoardView,“enableWhiteboardEdition”);
var tempGlobals={
SharedHiteBoardView:global.SharedHiteBoardView
};
global.SharedWhiteboardView=函数(){
返回MockSharedHiteBoardView;
};
module=Box.Application.getModuleForest('SharedHiteBoardModule',contextFake);
module.init();
var shouldEnable=true;
module.onmessage('SharedWhiteboardModule-setEditable',shouldEnable);
断言(MockSharedHiteBoardView.enableWhiteboardEdition.CalledWithJustice(ShoulEnable),
“应启用白板”);
shouldEnable=false;
module.onmessage('SharedWhiteboardModule-setEditable',shouldEnable);
断言(MockSharedHiteBoardView.enableWhiteboardEdition.CalledWithJustice(ShoulEnable),
“不应启用白板”);
//清理
global.SharedWhiteboardView=tempGlobals.SharedWhiteboardView;
完成();
});
就是这样

it('当类型为“SharedHiteBoardModule setEditable”时,应使用适当的回调函数调用setEditable',函数(完成){
var mockSharedHiteBoardView={
enableWhiteboardEdition:函数(){},
initWhiteboard:function(){},
initScrollBar:function(){},
刷新滚动条:函数(){},
isMainWhiteboardAvailable:函数(){}
};
spy(mockSharedHiteBoardView,“enableWhiteboardEdition”);
var tempGlobals={
SharedHiteBoardView:global.SharedHiteBoardView
};
global.SharedWhiteboardView=函数(){
返回MockSharedHiteBoardView;
};
module=Box.Application.getModuleForest('SharedHiteBoardModule',contextFake);
module.init();
var shouldEnable=true;
module.onmessage('SharedWhiteboardModule-setEditable',shouldEnable);
断言(MockSharedHiteBoardView.enableWhiteboardEdition.CalledWithJustice(ShoulEnable),
“应启用白板”);
shouldEnable=false;
module.onmessage('SharedWhiteboardModule-setEditable',shouldEnable);
断言(MockSharedHiteBoardView.enableWhiteboardEdition.CalledWithJustice(ShoulEnable),
“不应启用白板”);
//清理
global.SharedWhiteboardView=tempGlobals.SharedWhiteboardView;
完成();
});

很抱歉,但我在尝试时遇到了此错误:对象不是构造函数(正在计算“SharedHiteBoardView()”),您可以从
新建SharedHiteBoardView(…)
-尝试删除
新建
。此函数只需调用即可创建新对象。感谢您的帮助,请查看更新的问题。我从SharedHiteBoardModule.js中删除了new关键字,没有错误,但它没有击中我的控制台。Log抱歉,但我在尝试时遇到了此错误:对象不是构造函数(评估“SharedHiteBoardView()”),您可以从
新建SharedHiteBoardView(…)
-尝试删除
新建
。此函数只需调用即可创建新对象。感谢您的帮助,请查看更新的问题。我从SharedHiteBoardModule.js中删除了新的关键字,没有错误,但它没有击中我的控制台。第四次尝试公开您的设置。无法将SharedHiteBoardView工厂创建的现有方法的存根方法。这是因为这些是对象的方法,而不是SharedHiteBoardView.prototype。要解决此问题,可以将SharedHiteBoardView转换为构造函数,并在其原型上描述方法。另一种方法是将SharedHiteBoardView的“实例”作为模块的属性公开:
self.SharedHiteBoardView=new SharedHiteBoardView(..
a