Mocha测试异步函数

时间:2014-01-19 21:45:05

标签: javascript node.js testing coffeescript mocha

我正在编写一个节点包装器来与external api进行交互,并且很难测试异步createJob方法。以下是测试用例代码:

api_key = "test_0dc8d51e0acffcb1880e0f19c79b2f5b0cc"

lob     = require('../src/lob')(api_key)
should  = require("should")
chai    = require("chai")

data = 
  name: "test name"
  to: "Bob"
  from: "Alice"
  object1: "foo"
  object2: "bar"

describe "Job", ->
  @timeout(50000)
  describe "create", ->
    it "should create a job with address_id", (done) ->
      lob.jobs.createJob data, (new_job) ->
        new_job.should.not.be.empty
        new_job['name'].should.equal(data['name'])
        done()

修改

以上代码解决了问题

2 个答案:

答案 0 :(得分:3)

(在coffeescript中回答。如果您想将咖啡转换为js,请使用http://coffeescript.org/,然后使用Try CoffeeScript标签。)

如果您正在测试异步代码,则需要使用done模式:

describe "User", ->
  describe "#save()", ->
    it "should save without error", (done) ->
      user = new User("Luna")
      user.save done
“异步代码”下的

http://visionmedia.github.io/mocha/。看起来像createJob正在返回true,因为测试正在试图通过代码发送帖子等并说“是的,我发送了所有你问过的东西!”。

我推荐Martin Fowler关于使用mocha测试asynch js代码的文章:http://martinfowler.com/articles/asyncJS.html

我有一大堆代码用于测试从数据库中检索用户(使用sinon进行存根)。真实代码连接到db然后使用用户的配置调用onSuccess:onSuccess(config)

  describe 'Config', ->
    orgId = 'a'
    errorHandler = ((msg) -> (throw msg))
    beforeEach ->
      readConfig = sinon.stub(sdl , 'getConfig')
      readConfig.callsArgOnWithAsync(2, configSource, JSON.parse(jsonConfig))
    afterEach ->
      configSource.getConfig.restore()

......稍后

  configSource.getConfig('520bc323de4b6f7845543288', errorHandler, (config) ->
      config.should.not.be.null
      config.should.have.property('preferences')
      done()
  )

答案 1 :(得分:3)

不要将此视为对操作的回答,而是将其标记为正确的奖励。

刚刚完成@jcollum回答这里是他的Javascript版代码:

describe('User', function(){
    describe('#save()', function(){
        it("should save without error", function(done){
            var _user = new User("Moon");
            _user.save;
            done();
        });
    });
 });

这很明显,但也许有些新手需要这个附录。