2

Jasmine を使い始めたばかりで、初めていくつかのテストを設定しようとしています。バックボーン コレクションがあります。コレクションを beforeEach() メソッドの一部として取得し、それに対してテストを実行すると考えました。

アプリのプロトタイプを作成するときに使用したテスト json オブジェクトがあるので、呼び出しをモックするのではなく、そのオブジェクトをテスト用に再利用したいと考えています。

これまでの私のコードは次のとおりです(そして失敗しています)。

describe("Vehicle collection", function() {
    beforeEach(function() {
        this.vehicleCollection = new Incentives.VehiclesCollection();
        this.vehicleCollection.url = '../../json/20121029.json';
        this.vehicleCollection.fetch();
        console.log(this.vehicleCollection);
    });

    it("should contain models", function() {
        expect(this.vehicleCollection.length).toEqual(36);
        console.log(this.vehicleCollection.length); // returns 0
    });
});

beforeEach メソッドで console.log すると、コンソールは次のようになります...

d {length: 0, models: Array[0], _byId: Object, _byCid: Object, url: "../../json/20121029.json"}

不思議なことに、Chrome 開発者ツールでオブジェクト (小さな三角形) を展開すると、コレクションには車両モデルの配列などが完全に取り込まれます。それでも、テストは失敗します。

Error: Expected 0 to equal 36

「waitsFor()」メソッドを活用する必要があるかどうか疑問に思っていますか?

UPDATE(作業コード付き)

助けてくれてありがとう!

@ deven98602 - あなたは私を正しい軌道に乗せました。最終的に、この「waitsFor()」の実装は最終的に機能しました。このコードが他の人に役立つことを願っています! これが貧弱なテクニックである場合は、コメントを残してください。ありがとう!

describe("A Vehicle collection", function() {

    it("should contain models", function() {

        var result; 
        var vehicleCollection = new Incentives.VehiclesCollection();
        vehicleCollection.url = '/json/20121029.json';
        getCollection();

        waitsFor(function() {
            return result === true;
        }, "to retrive all vehicles from json", 3000);

        runs(function() {
            expect(vehicleCollection.length).toEqual(36);
        });

        function getCollection() {
            vehicleCollection.fetch({
                success : function(){
                    result = true;
                },
                error : function () {
                    result = false;
                }
            });
        }

    });
});
4

2 に答える 2

2

fetchあなたのコードをちらりと見るだけで、期待を実行したときにまだコレクションにデータが入力されていないように見えます。

からの戻り値を使用して、 andfetchを使用して応答が受信されるまで期待を延期できます。waitsForruns

beforeEach(function() {
    this.vehicleCollection = new Incentives.VehiclesCollection();
    this.vehicleCollection.url = '../../json/20121029.json';
    var deferred = this.vehicleCollection.fetch();
    waitsFor(function() { return deferred.done() && true });
});

it("should contain models", function() {
    runs(function() {
        expect(this.vehicleCollection.length).toEqual(36);
    });
});

私は実際にこれを試していないので、そのままで動作することを保証することはできませんが、解決策は次のようになります。Jasmine を使用した非同期テストの詳細については、この記事を参照してください。

于 2012-11-16T02:30:56.480 に答える
1

collection.fetch() は、成功とエラーのコールバックを受け入れる非同期呼び出しです

var result; 
this.collection.fetch({success : function(){
result = true;
}})

waitsFor(function() {
return response !== undefined;
}, 'must be set to true', 1000);


runs(function() {
expect(this.vehicleCollection.length).toEqual(36);
console.log(this.vehicleCollection.length); // returns 0
});
于 2012-11-16T02:41:06.227 に答える