如何使用jasmine-node测试函数,jasmine-node内部调用一个返回promise的函数?

时间:2015-01-07 12:46:37

标签: javascript node.js unit-testing jasmine promise

我只是在试用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()成功方法没有被调用,所以我的测试失败了。

2 个答案:

答案 0 :(得分:2)

您的getQuestions方法永远无法解决承诺。

您有一个从09的循环,但您只能在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.