【发布时间】:2013-06-28 02:33:07
【问题描述】:
我正在尝试对 Jasmine 和 RequireJS 进行一些测试。一切都很顺利,直到我注意到我所描述的函数的上下文存在问题。
我正在做一些 Ajax 测试,所以我要做的第一件事是设置成功的侦听器,然后请求该服务。然后,在我的每个 it() 声明中,我根据服务响应进行测试。
这是我的spec modules:
// 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 具有相同的值。第一个运行的模块设置它的值,其他规范将具有相同的值。我需要每个模块有一个值,以便我可以正确测试每个服务响应。
理论上,每个模块都应该有自己的作用域,但看起来并没有发生这种情况。
有人知道如何解决这个问题吗?
【问题讨论】:
-
附带说明,Jasmine 2.0.0 现在为
it()方法提供了一个可选的done参数,允许您使用更少的代码编写异步测试。但是,还要注意,如果您使用的是Karma test runner、Karma currently comes bundled with Jasmine 1.3.1,那么在这种情况下您将无法使用新的done参数(至少在 Karma 更新其 Jasmine 版本之前)。 -
Testing Asynchronous Javascript w/ Jasmine 2.0.0 是一篇很好的博文,介绍了如何使用新的 Jasmine 2.0.0
done参数,如果您有可用的 Jasmine 版本。 -
@Cupcake 哦,终于!好东西。我目前正在使用 Konacha 以及 Sinon 和 Chai 进行测试。我必须再给 Jasmine 一次机会 :)
标签: javascript ajax unit-testing asynchronous jasmine