私は RequireJS と Jasmine の両方にかなり慣れていないので、最初にいくつかの基本的なテストをセットアップするのに少し苦労しています。2つを一緒にセットアップして機能させる方法に関する多くの情報を見つけました。しかし、私には解決できない興味深い問題があります。
残念ながら、問題を表現する最善の方法がわからないので、ここにいくつかのコードを示します。
main.js:
require(['jquery', 'manipulate'], function($, Manipulate) {
var manipulate = new Manipulate;
$(document).on('change', 'td input', function() {
manipulate.pushChange();
});
});
操作.js:
define(function() {
function Manipulate() {
//
};
Manipulate.prototype.pushChange = function() {
return true;
};
return Manipulate;
});
ManipulateSpec.js:
describe('Manipulate', function() {
var manipulate;
beforeEach(function() {
var flag = false;
// Load fixtures into the HTML
loadFixtures('ManipulateFixture.html');
// Require the manipulate.js file
require(['jquery', 'manipulate', 'main'], function(jQuery, Manipulate) {
manipulate = new Manipulate;
// Define any spies
spyOn(manipulate, 'pushChange');
flag = true;
});
// Wait for manipulate.js to load before running tests
waitsFor(function() {
return flag;
});
});
it('should call pushChange after changing a cell', function() {
$('td input').eq(0).trigger('change');
expect(manipulate.pushChange).toHaveBeenCalled();
});
});
(余分なコードを削除しました)
私console.log
が中にいる場合Manipulate.pushChange
、それは発砲しています。問題は、スパイされているオブジェクトが、ファイルManipulate
で引数として渡されるオブジェクトと同じではないことです。main.js
したがってmanipulate.pushChange
、it()
ブロックを追加すると、テストに合格します。
を呼び出す Backbone.js アプリの回答が見つかりましたdelegateEvents
。バニラ Javascript、jQuery などに同様のソリューションがあるかどうかはわかりませんが、見つかりません。
私のファイルを構造化するより良い方法はありますか? それとも、2 つのオブジェクト間でイベントを「コピー」する方法ですか? createSpy
この場合、使用が私を大いに助けるとさえ信じていません。