使用Jasmine进行异步测试

11 浏览
0 Comments

使用Jasmine进行异步测试

我正在尝试使用Jasmine和RequireJS进行一些测试。一切进行得很顺利,直到我注意到我在描述函数时遇到了一个上下文问题。

我正在进行一些Ajax测试,所以我首先要做的是设置一个成功的监听器,然后请求该服务。然后,在每个it()声明中,我根据服务的响应进行测试。

这是我的规范模块

// auth.js
define(['service/auth'], function(auth) {
  describe('测试 "auth" 服务', function() {
    var data;
    var OPTIONS = {
      CN: '147144147',
      GV: '147153162'
    };
    auth.on.success.addOnce(function(response) {
      data = response;
    });
    auth.request(OPTIONS);
    it('"status" 应该存在且为 "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('测试 "login" 服务', function() {
    var data;
    var OPTIONS = {
      oper: 1,
      codigoouemail: '101',
      senha: '10151015'
    };
    login.on.success.addOnce(function( response ) {
      data = response;
    });
    login.request(OPTIONS);
    it('应该获取用户 "' + OPTIONS.codigoouemail + '" 的服务响应', function() {
      waitsFor(function() {
        return data !== undefined;
      });
      runs(function() {
        expect(data).toBeDefined();
      });
    });
  });
});

当单独进行测试时,它们都工作得很好,但我注意到它们共享相同的data值。第一个模块运行时,设置了它的值,其他规范将具有相同的值。我需要每个模块都有一个单独的值,这样我才能正确测试每个服务的响应。

理论上,每个模块应该有自己的作用域,但看起来并不是这样发生的。

有人有解决办法吗?

0
0 Comments

问题的原因是Javascript具有函数作用域,所以两个data变量是不同的。问题可能是Jasmine在处理异步代码时与函数上下文不兼容。解决方法暂未提出。

以下是整理后的

很抱歉,但问题不在于数据变量。Javascript具有函数作用域,因此两个data变量是不同的。这里有一个例子,展示了data不是相同的: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);
            });
        });
    });

是的,我知道这个问题。困扰我的是RequireJS应该处理函数作用域(而且它确实做得很好)。所以我认为问题出在Jasmine对于异步代码和函数上下文的处理不兼容。我甚至找到了一些有同样问题的人......

嘿,朋友,我看出你在这里的用意了...data在每个describe()中有不同的值,这正是我想要的,但为什么我没有得到相同的结果呢?当我打印data的值时,它总是第一个response的值。这真的很让我烦恼......

0
0 Comments

Async test with Jasmine is a testing issue that occurred due to an error in the ajax call. The ajax call was returning the same value every time, causing the tests to fail consistently. However, the issue has been resolved.

以下是中文输出:

Async test with Jasmine(使用Jasmine进行异步测试)是一个测试问题,它是由于ajax调用中的错误导致的。ajax调用始终返回相同的值,导致测试始终失败。不过,问题已经解决。

0
0 Comments

问题:Async test with Jasmine出现的原因是为了检查VOs是否被创建。

解决方法:通过设置deferred对象来监听异步函数的完成状态,等待50ms以确保应用程序已准备就绪,然后运行异步函数。在回调函数中使用expect来进行断言。

0