【问题标题】:Mocha tests for asynchronous functionsMocha 测试异步函数
【发布时间】:2014-02-08 23:29:42
【问题描述】:

我正在编写一个节点包装器来与 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()

编辑

以上代码解决了问题

【问题讨论】:

标签: javascript node.js testing coffeescript mocha.js


【解决方案1】:

(在coffeescript 中回答。如果您想将coffee 转换为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 测试异步 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()
  )

【讨论】:

  • 我还认为lob 变量需要在全局以及beforeEach 函数中声明,类似于data 的声明方式。下班后我得看看这个。
  • 我不知道为什么会这样——是否需要在每次运行之前以某种方式进行初始化?
  • 不,我猜它没有 - 如果是这样,那么 data 也不需要包含在 beforeEach 函数中
  • 好吧,你似乎有一个data 用于许多测试,我认为它在正确的位置
  • done 总是在你的“成功”回调中调用。如果您发布到一个站点,请将您的完成放入发布完成且没有错误时触发的代码中。实际完成也会进入错误回调,但失败。我不记得如何直接让 mocha 测试失败,抱歉。
【解决方案2】:

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

为了完成@jcollum 的回答,这里是他代码的 Javascript 版本:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多