我正在尝试使用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
共享相同的值。要运行的第一个模块,设置其值,其他规格将具有相同的值。我需要为每个模块设置一个值,以便我可以正确测试每个服务响应。
从理论上讲,每个模块都应该有自己的范围,但看起来不会发生这种情况。
有人知道如何解决这个问题吗?
答案 0 :(得分: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();
});
});
首先我运行一个函数来监听我的异步函数何时完成,我等待50ms来检查应用程序是否准备就绪然后我运行我的异步函数。注意expect
在回调中是如何形成的。
答案 1 :(得分:1)
所以这完全是我的坏事。这是ajax调用的一个错误,它给了我相同的值,因此没有通过所有的测试。无论如何,感谢您的帮助:)
答案 2 :(得分: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);
});
});
});