8

Karma、Jasmine、Jasmine.Async、Sinon、Chai を使用しています。

朗報です...このテストは正しく機能します。依存関係が嘲笑され、スパイが呼び出され、意図的にテスト対象を壊すとテストが失敗します。

define(['chai', 'squire'], function (chai, Squire) {

    var should = chai.should(),
        async = new AsyncSpec(this),
        subject, injector = new Squire();

    describe('EventsView', function () {

        describe('when an event is clicked', function () {
            var mockModel, stub;

            async.beforeEach(function (done) {
                setFixtures('<div id="screen"></div>');

                mockModel = {
                    toJSON: function () {
                        return {
                            dimensions: "hu1 vu2",
                            events: [{
                                date: "8/29/2013",
                                id: "8923",
                                title: "Fancy Show",
                                venue: "Lovely venue",
                            }, {
                                date: "8/29/2013",
                                id: "9034",
                                title: "Exciting Game",
                                venue: "Lovely stadium"
                            }],
                            id: 3566,
                            kind: "events",
                            title: "Top events this week"
                        };
                    },
                    fetch: function () {}
                };
                stub = sinon.stub();
                injector.mock('tiles/events-tile/events-detail-model', Squire.Helpers.constructs({
                    fetch: stub
                }));
                injector.require(["tiles/events-tile/events-view"], function (ev) {
                    subject = new ev(mockModel);
                    done();
                });
            });

            async.afterEach(function (done) {
                injector.clean();
                injector.remove();
                done();
            });


            async.it('should attempt to fetch the event details', function (done) {
                $('#screen').html(subject.$el);
                $('.event').first().click();
                stub.called.should.be.true;
                done();
            });
        });
    });
});

悪いニュースは...以前は問題がなかった他のテストの一部が、奇妙な理由で失敗するようになったことです。例: Error: Backbone.history has already been startedTypeError: 'undefined' is not an object (evaluating 'Backbone.Validation.mixin')

スニペットをコメントアウトすると

injector.require(["tiles/events-tile/events-view"], function (ev) {
  subject = new ev(mockModel);
    done();
});

その後、他のテストが再び機能します。以前にこのようなことが起こったことがありますが、通常はシノンモックが復元されないことが原因でした。このinjector.clean()呼び出しは、私が望んでいた魔法の弾丸を提供していないようです.

4

2 に答える 2

5

私の経験では、Squire は問題を解決するよりも多くの頭痛の種を引き起こします。jQuery プラグインを使用していますか? それらは squire とうまく連携せず、後続のテストが失敗する可能性があることがわかりました。その場合は、このブログで対処方法を確認してください。

ただし、スクワイアを完全に捨てることをお勧めします。sinon を使用し、独自のユーティリティを作成して必要なものを正確にモックすると、非同期テストが再び同期化されるだけでなく (テスト対象のコードが同期化されます)、よりテストしやすいコードの作成も促進されます。また、コードとライブラリをより深いレベルで理解するのにも役立ちます。Backbone.history をスタブ化して、実際にルートをトリガーせずにルーティング アクションを実行することは、テスト ライブラリに追加する優れた演習であり、素晴らしいユーティリティです。

于 2014-01-03T15:27:52.077 に答える
3

問題は非 AMD モジュールにあります。私の記憶が正しければ、Squire が新しいコンテキストを作成するときに、グローバル名前空間に AMD 以外のモジュールの新しいインスタンスが作成されます。その結果、コードとテストが別のオブジェクトを参照することになります。次のようにして、この問題を解決できたと思います。

var injector = new Squire();
injector.mock("backbone", function() {
  return Backbone;
});

Squire は、AMD 以外のモジュールをより適切に処理する必要があります。

于 2014-05-14T13:08:33.057 に答える