单元测试,Sinon js间谍

时间:2016-11-26 16:23:32

标签: javascript unit-testing mocha sinon

所以我有这个小功能

module.exports = {
  setupNewUser(info, callback) {
    var user = {
      name: info.name,
      nameLowercase: info.name.toLowerCase()
    }

    try {
      Database.save(user, callback)
    }
    catch(err) {
      callback(err)
    }
  }
}

我正在使用sinon来测试这种方法

const setupNewUser = require('./index').setupNewUser
const sinon = require('sinon')
const assert = require('assert')

const Database = {
  save(info, cb) {
    if (info === undefined) {
      return cb('nope')
    } else {
      return cb()
    }
  }
}

describe('#save()', function () {
  it('should call save once', function() {
    var save = sinon.spy(Database, 'save')

    setupNewUser({ name: 'test' }, function() { })

    save.restore()
    sinon.assert.calledOnce(save)
  })
})

当我运行测试时,它失败有人知道为什么吗?

错误消息

  

AssertError:预期保存被调用一次,但被称为0次

1 个答案:

答案 0 :(得分:1)

我相信发生这种情况的原因是因为你并没有真正找出你认为自己的方法。在您的测试代码中,您的目的是创建一个假的Database对象,以便您的实际源代码将调用此对象的方法。您需要存根的是源代码使用的实际Database对象。

通常在源代码中,您可能会导入Database对象。您还需要导入相同的Database对象,并将其存储在测试代码中。