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. 第一个运行的模块设置它的值,其他规范将具有相同的值。我需要每个模块有一个值,以便我可以正确测试每个服务响应。理论上,每个模块都应该有自己的范围,但看起来并没有发生这种情况。

有人对如何解决这个问题有任何想法吗?

4

3 回答 3

1

所以这里有一个异步测试的例子,我用它来检查我VOs的是否被创建:

it('should return a list of item VOs', function() {
  var dfd = $q.defer();
  var items = mock.content.items[1].items;

  runs(function() {
    dfd.promise.then(function(VOs) {
      expect(VOs.length).toBe(items.length);
      expect(A.equals(itemVO(items[0]), VOs[0])).toBe(true);
    }, this.fail);
  });

  waits(50);

  runs(function() {
    itemsVO(dfd, items);

    $rootScope.$digest();
  });
});

所以首先我运行一个函数来监听我的异步函数何时完成,我等待 50 毫秒以检查应用程序是否准备就绪,然后我运行我的异步函数。注意expect回调中的 。

于 2013-07-01T14:09:14.780 回答
1

所以这完全是我的错。这是 ajax 调用的错误,它总是给我相同的值,因此所有测试都失败了。无论如何感谢您的帮助:)

于 2013-07-01T16:02:01.227 回答
0

很抱歉,问题不在于数据变量。Javascript 有函数作用域,所以两个数据变量是不同的。这是一个显示数据不一样的小提琴: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 回答