5

次のJasminetest(1)を実行すると、テストは正常に実行されますが、メインテストページの再帰的な読み込みに直面しています。

これが私のテスト(1)であり、ここで私がテストを実行しているモジュール(2)です。

何か案は?どうすれば問題を解決できますか?

PS:
問題はChromeとSafariブラウザだけに関係しています。
次に例を示します:jsfiddle.net/shioyama/EXvZY


(1)

describe('When Submit button handler fired', function () {
    beforeEach(function () {
        spyOn(MyView.prototype, 'submitForm');
        this.view = new MyView();
        this.view.render();
        this.view.$el.find('form').submit();
    });

    it('submitForm should be called', function () {
        expect(MyView.prototype.submitForm).toHaveBeenCalled();
    });
});

(2)

var MyView = Backbone.View.extend({
    events: {
        'submit form' : 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();
        // some code
    }
});
4

1 に答える 1

3

バックボーンは、ビューの作成時にバインドされるデリゲートイベントを使用します。view.elには、作成時にフォームが含まれていませんが、代わりに、renderメソッドでフォームを作成しています。そのため、送信デリゲートイベントはバインドされず、代わりにページ上のフォームを送信します。そのフォーム送信は同じURLに送信され、Jasmineスイートが再度実行されるようにトリガーされ、ループが発生します。

コードを少し変更すると、ビューが生成される前に<form>要素が存在するため、このバージョンが機能することがわかります。

var MyView = Backbone.View.extend({
    events: {
        'submit form' : 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();
        // some code
    }
});

//start test runner right after we're done defining our tests in this script
window.setTimeout( function(){
    jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
    jasmine.getEnv().execute();
}, 0 );

//TESTS GO HERE
describe('When Submit button handler fired', function () {
    beforeEach(function () {
        spyOn(MyView.prototype, 'submitForm').andCallThrough();
        this.view = new MyView({
            el: $('<div><form><input type="submit" value="Submit" /></form></div>')
        });
        this.view.$el.find('form').submit();
    });

    it('submitForm should be called', function () {
        expect(MyView.prototype.submitForm).toHaveBeenCalled();
    });
});​

</ p>

于 2012-08-20T10:44:38.807 に答える