2017-02-08 8 views
1

オブジェクトに対しての新しいキーワードで作成されたすべてのインスタンスをモックアウトしようとしています。ここでオブジェクトのインスタンスをモックアウトしようとすると、Sinonスタブが動作しない

が、私はモックしようとしていますオブジェクトです:

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); 
    }; 
} 

I sharedWhiteboardView.enableWhiteboardEditionメソッドが 'false'で呼び出されたかどうかをテストするユニットテストを作成しようとしています

しかし、私はスパイまたはスタブをそのメソッドから外していません。私はこれらのソリューションを試してみましたが、彼らは

//最初の試行

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

// 2番目の試み

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

// 3回目の試み

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

//第四に動作しませんでした試行chrmodによって提供された答えを試す

機能 として未定義のプロパティenableWhiteboardEditionをラップする

-Attempted - :

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をヒットしない、私は私が得た提案

エラーとして「新しい」キーワードを削除しました存在しないプロパティをスタブすることはできませんenableWhiteboardEdition

助けてください。私はここで死んだ終わりに達しました。ここで

はcodepenです:http://codepen.io/anon/pen/bgmNxx?editors=0011

私がやろうとしていますすべては私のモジュールがenableEdition

+0

あなたの設定は何ですか? SharedWhiteboardViewファクトリで作成された既存のメソッドのメソッドをスタブする方法はありません。これは、それらがSharedWhiteboardView.prototypeではなくオブジェクトのメソッドであるためです。この問題を解決するには、SharedWhiteboardViewをコンストラクタに変換し、そのプロトタイプのメソッドを記述することができます。 もう一つの方法は、SharedWhiteboardViewの "インスタンス"をモジュールのプロパティとして公開することです。sharedWhiteboardView = new SharedWhiteboardView(.. ')そして、特定のオブジェクトにスタブを置く:' sinon.stub(module.sharedWhiteboardView、... ' – chrmod

+0

私はこれを試しました - self.sharedWhiteboardView = new SharedWhiteboardView(moduleEl、domService);私のテストでは、sinon.stub(module.sharedWhiteboardView)を実行しました。(console.log( "Hit"); }); undefinedはコンストラクタではありません'sinon.stub(module.sharedWhiteboardView) – alyn000r

+0

http://codepen.io/anon/pen/VPEYKj?editors=0011 < - Codepenを作成 – alyn000r

答えて

0

SharedWhiteboardViewが、それはむしろファクトリ関数で、コンストラクタではありません呼び出すときに偽の方法が打撃を受けることです。一度呼び出されると(新しいものなし)、enableWhiteboardEditionという独自のプロパティーを持つ新しいオブジェクトを返します。

したがってスタブは、そのオブジェクトに設定されなければならない。

const view = SharedWhiteboardView(); sinon.stub(view, "enableWhiteboardEdition", function() {return 0});
+0

申し訳ありませんが、私はトリオブジェクトはコンストラクタではありません(SharedWhiteboardView()を評価しています) – alyn000r

+0

あなたは 'new SharedWhiteboardView(..)'からそれを取得します。 'new'を削除してみてください。この関数は、呼び出されるだけで新しいオブジェクトを作成します。 – chrmod

+0

私を助けてくれてありがとう、更新された質問をご覧ください。私はSharedWhiteboardModule.jsから新しいキーワードを削除しましたが、エラーはありませんが、私のconsole.logには当たらない – alyn000r

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(); 

})。

これはそれでした

関連する問題