Require.jsとBackbone.Marionetteを使用してBackbone.jsアプリを作成し、Chai、Sinon、およびSinon-ChaiでMochaを使用してテストしています。私は通常、JarrodOversonのBackboneMarionetteとRequire.JSTODOサンプルをアプリケーション構造のリファレンスとして使用し、 JimNewberyのBackboneアプリのテストに関する投稿を単体テストのリファレンスとして使用しています。
私の問題は、MarionetteItemViewをMarionetteApplicationオブジェクトに追加することをテストしようとしています。ItemViewが追加されていることをテストする最良の方法は、そのrender()
メソッドが呼び出されるのを監視することだと思いました。Marionetteはデフォルトのrender()
実装を提供しているので、コールバックにはSinonスパイを使用するのが最善だと思いましたonRender()
。
以下に示すように、Squire.JSを使用してItemViewのスタブクラスを返しました。
define(['Squire', 'backbone.marionette'], function(Squire, Marionette) {
describe('App', function() {
var testContext;
beforeEach(function(done) {
testContext = {};
testContext.injector = new Squire();
testContext.renderSpy = sinon.spy();
testContext.injector.mock('app/views/Header', function() {
var stub_template_html = "<div></div>";
var HeaderStub = Marionette.ItemView.extend({
template: function(serialized_model) {
return _.template(stub_template_html);
}
});
return HeaderStub;
});
testContext.injector.require(['app/app'], function(app) {
testContext.app = app;
done();
});
});
it ('Should add a Header view to the \'header\' region', function() {
testContext.app.start();
expect(testContext.renderSpy).to.be.called();
});
Chrome経由でMochaを実行すると、「スパイが少なくとも1回呼び出されたと予想されましたが、呼び出されなかった」というエラーが表示されます。onRender()
ただし、以下に示すように、コールバックとしてSinonスパイ関数を指定した場合
var HeaderStub = Marionette.ItemView.extend({
// ...
onRender: testContext.renderSpy
});
called()
メソッドが関数ではないというエラーが表示されます。
クラス定義のメソッドとしてSinonスパイ関数を指定する方法はありますか?あるいは、このコードをテストするためのより良い方法はありますか?私はJavaScriptにかなり慣れていないので、これはSinon固有の問題ではなく、より一般的な問題である可能性があります。
どんな助けでも大歓迎です。