Javascript 异步函数的Mocha测试

Javascript 异步函数的Mocha测试,javascript,node.js,testing,coffeescript,mocha.js,Javascript,Node.js,Testing,Coffeescript,Mocha.js,我正在编写一个节点包装器来与一个节点进行交互,并且在测试异步createJob方法时遇到了困难。下面是测试用例代码: api_key = "test_0dc8d51e0acffcb1880e0f19c79b2f5b0cc" lob = require('../src/lob')(api_key) should = require("should") chai = require("chai") data = name: "test name" to: "Bob"

我正在编写一个节点包装器来与一个节点进行交互,并且在测试异步
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()
编辑

上面的代码解决了这个问题(用coffeescript回答。如果您想将coffeescript转换为js use,请使用Try coffeescript选项卡)

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

describe "User", ->
  describe "#save()", ->
    it "should save without error", (done) ->
      user = new User("Luna")
      user.save done
在“异步代码”下。看起来createJob返回true,因为测试正在压缩代码以发送帖子等,并说“是的,我按照您的要求发送了所有内容!”

我推荐Martin Fowler关于使用mocha测试异步js代码的文章:

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

。。。后来

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

不要认为这是对OP的一种回答,而是一个被标记为正确的奖励。< /强>

只需完成@jcollum answer,以下是him代码的Javascript版本:

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

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

我还认为在每个函数之前,
lob
变量需要在
函数中声明,也需要在
函数中声明,类似于
数据
的声明方式。我必须在下班后检查一下。我不知道为什么会这样——每次运行之前是否需要以某种方式初始化它?不,我想不是这样的-如果是这样的话,
data
就不需要在beforeach函数中进行包装了。好吧,您可能会有一个
data
用于许多测试,我认为它位于正确的位置,在“success”回调中总是调用done。如果你发布到一个站点,把你的“完成”放在代码中,当发布没有错误时会触发代码。“实际完成”也会进入错误回调,但会失败。对不起,我不记得如何直接用摩卡考试不及格
describe('User', function(){
    describe('#save()', function(){
        it("should save without error", function(done){
            var _user = new User("Moon");
            _user.save;
            done();
        });
    });
 });