2

Jasmine と RequireJS でいくつかのテストをしようとしています。記述している関数のコンテキストに関して問題があることに気付くまで、すべてがうまくいっていました。

私はいくつかの Ajax テストを行っているので、最初に行うことは、成功するためのリスナーをセットアップしてから、そのサービスを要求することです。次に、各it()宣言内で、サービスの応答に基づいてテストを行います。

ここに私のスペックモジュールがあります:

// auth.js
define(['service/auth'], function(auth) {
  describe('Tests "auth" service', function() {
    var data;
    var OPTIONS = {
      CN: '147144147',
      GV: '147153162'
    };

    auth.on.success.addOnce(function(response) {
      data = response;
    });

    auth.request(OPTIONS);

    it('"status" should exist and be "true"', function() {
      waitsFor(function() {
        return data !== undefined;
      });

      runs(function() {
        expect(data['status']).toBeDefined();
        expect(data['status']).toBeTruthy();
      });
    });

  });
});

// login.js
define(['service/login'], function(login) {
  describe('Tests "login" service', function() {
    var data;
    var OPTIONS = {
      oper: 1,
      codigoouemail: '101',
      senha: '10151015'
    };

    login.on.success.addOnce(function( response ) {
      data = response;
    });

    login.request(OPTIONS);

    it('Should get the service response for user "' + OPTIONS.codigoouemail + '"', function() {
      waitsFor(function() {
        return data !== undefined;
      });

      runs(function() {
        expect(data).toBeDefined();
      });
    });

  });
});

個別にテストすると両方とも正常に動作しますが、私が気付いたのは、data. 最初に実行するモジュールがその値を設定し、他の仕様も同じ値になります。各サービスの応答を適切にテストできるように、モジュールごとに 1 つの値が必要です。理論的には、すべてのモジュールに独自のスコープがあるはずですが、これが起こっているようには見えません。

誰かがこれを解決する方法について何か考えがありますか?

4

3 に答える 3

0

申し訳ありませんが、問題はデータ変数にはありません。Javascript には関数スコープがあるため、2 つのデータ変数は異なります。これは、データが同じではないことを示すフィドルです: http://jsfiddle.net/LNuHU/2/

以下はコードです:

//--- SPECS -------------------------
describe('Tests timeout service 1', function() {

        var data;

        setTimeout(function( response ) {
            data = 3;
        }, 1000);


        it('Should be 3', function() {

            waitsFor(function() {
                return data !== undefined;
            });

            runs(function() {
                expect(data).toBe(3);
            });

        });


        it('Should be 30', function() {

            waitsFor(function() {
                return data === 30;
            });

            runs(function() {
                expect(data).toBe(30);
            });

        });

    });

describe('Tests timeout service 2', function() {

        var data;

        setTimeout(function( response ) {
            data = 30;
        }, 2000);


        it('Should be 30', function() {

            waitsFor(function() {
                return data !== undefined;
            });

            runs(function() {
                expect(data).toBe(30);
            });

        });


        it('Should be 30', function() {

            waitsFor(function() {
                return data === 3;
            });

            runs(function() {
                expect(data).toBe(3);
            });

        });

    });
于 2013-07-01T04:12:36.083 に答える