我只是在试用jasmine-node。我需要一些有希望解决方案的帮助。我有简单的js文件
//dataService.js
var Q = require('q');
console.info("Q is "+Q);
exports.test = function() {
console.warn("Will call promise now");
this.getQuestions().then(function() {
console.log("Test..");
});
};
exports.getQuestions = function() {
var deferred = Q.defer();
for(i=0; i<=10; i++) {
if(i===10) {
deferred.resolve(i);
}
}
return deferred.promise;
// return {
// 'Question1': 'What is your name'
// }
}
//end of dataService.js
And the test is
// testspec.js
var assert = require("assert");
var q = require('q');
var testFile = require('../routes/dataService');
var fs = require('fs');
describe('#indexOf()', function(done){
it('should return -1 when the value is not present', function(done){
console.log("Teststststst" + fs);
assert.equal(-1, [1,2,3].indexOf(5));
assert.equal(-1, [1,2,3].indexOf(0));
spyOn(testFile, 'getQuestions').andCallFake(function() {
console.warn("Spy Called********************");
var deferred = q.defer();
deferred.resolve(1);
console.info("passing 1****");
//done(1);
return deferred.promise;
});
spyOn(console, 'log');
testFile.test();
console.info("Testststststsinggggggggg");
expect(console.log).toHaveBeenCalledWith("Test..");
console.info("Done*****************");
})
});
//测试文件的结尾
现在您可以看到我正在调用testFile.test()函数,这只是dataService.js中的测试函数。此函数调用dataService.js(同一文件)中的getQuestions(),该函数返回一个promise。我在我的测试中模拟了getQuestions()函数,它被调用并且正在解析promise,但是我的test()成功方法没有被调用,所以我的测试失败了。
答案 0 :(得分:2)
您的getQuestions
方法永远无法解决承诺。
您有一个从0
到9
的循环,但您只能在i === 10
时解决它。
变化:
for(i=0; i<10; i++) {
if(i===10) {
deferred.resolve(i);
}
}
要:
deferred.resolve(10);
作为一个通用的提示方法,调用返回promises 的函数应该返回promises本身,这样你就可以轻松地测试它们并挂钩它们的完成。出于这个原因,我会让.test
返回一个承诺(而不仅仅是称之为)
答案 1 :(得分:0)
I was able to run the test by returning a promise from the test() function.
//dataService.js
var Q = require('q');
console.info("Q is "+Q);
exports.test = function() {
console.warn("Will call promise now");
return this.getQuestions().then(function() {
console.log("Test..");
return 'success';
});
};
exports.getQuestions = function() {
var deferred = Q.defer();
for(i=0; i<10; i++) {
if(i===3) {
deferred.resolve(i);
}
}
return deferred.promise;
// return {
// 'Question1': 'What is your name'
// }
}
//end of dataService.js
//dataServicespec.js
var assert = require("assert");
var q = require('q');
var testFile = require('../routes/dataService');//include the dataService.js
var fs = require('fs');
describe('Tests', function(done) {
it('should run the test properly', function(done) {
console.log("Teststststst" + fs);
var flag = false;
var deferred;
spyOn(testFile, 'getQuestions').andCallFake(function() {
console.warn("Spy Called********************");
deferred = q.defer();
console.info("passing 1****");
deferred.resolve(1);
return deferred.promise;
});
spyOn(console, 'log');
runs(function() {
var p = testFile.test();
p.then(function() {
flag = true;
});
});
waitsFor(function() {
if (flag === true)
return true;
});
runs(function() {
console.info("Testststststsinggggggggg");
expect(console.log).toHaveBeenCalledWith("Test..");
console.info("Done*****************");
done();
});
})
});
//end of dataServicespec.js
Thanx @Benjamin on you suggestion for returning a promise from test.