如何在Sinon中检查具有适当属性的类构造函数是否被调用?

时间:2018-12-13 16:09:38

标签: javascript tdd sinon

我正在测试从外部库实例化对象的代码。为了使其可测试,我决定注入依赖项:

归结为:

const decorator = function (obj, _extLib) {
  var ExtLib = _extLib || require('extlib')
  config = determineConfig(obj) //This is the part that needs testing.
  var el = new ExtLib(obj.name, config)
  return {
    status: el.pay({ amt: "one million", to: "minime" })
    bar: obj.bar
  }
}

在测试中,我需要确定外部库已使用正确的config实例化。我对这个外部库是否起作用(是否起作用)或是否调用它给出结果并不感兴趣。为了举例说明,让我们假设在实例化时,它调用了慢速的银行API,然后锁定了数百万美元:我们希望对它进行存根,模拟和欺骗。

在我的测试中:

it('instantiates extLib with proper bank_acct', (done) => {
  class FakeExtLib {
    constructor(config) {
      this.acct = config.bank_acct
    } 
    this.payMillions = function() { return }
  }

  var spy = sandbox.spy(FakeExtLib)
  decorator({}, spy) // or, maybe decorator({}, FakeExtLib)?
  sinon.assert.calledWithNew(spy, { bank_acct: "1337" })

  done()
})

请注意,测试还包括el.pay()在sinon中被称为使用间谍可以正常工作。用new实例化,似乎无法测试。

为了进行调查,让我们更简单,甚至内联测试所有内容,完全避免测试对象,decorator函数:

it('instantiates inline ExtLib with proper bank_acct', (done) => {
  class ExtLib {
    constructor(config) {
      this.acct = config.bank_acct
    }
  }

  var spy = sandbox.spy(ExtLib)
  el = new ExtLib({ bank_acct: "1337" })
  expect(el.acct).to.equal("1337")
  sinon.assert.calledWithNew(spy, { bank_acct: "1337" })
  done()
})

expect部分通过。因此,显然所有这些都被正确地调用了。但是sinon.assert失败。仍然。为什么?

如何检查在Sinon中是否使用适当的属性调用了类构造函数?” calledWithNew是否以此方式使用?我应该监视诸如ExtLib.prototype.constructor之类的其他函数吗? ,如何?

1 个答案:

答案 0 :(得分:1)

您真的很亲近。

在最简单的示例中,您只需使用el而不是spy创建ExtLib

it('instantiates inline ExtLib with proper bank_acct', (done) => {
  class ExtLib {
    constructor(config) {
      this.acct = config.bank_acct
    }
  }

  var spy = sandbox.spy(ExtLib)
  var el = new spy({ bank_acct: "1337" })  // use the spy as the constructor
  expect(el.acct).to.equal("1337")  // SUCCESS
  sinon.assert.calledWithNew(spy)  // SUCCESS
  sinon.assert.calledWithExactly(spy, { bank_acct: "1337" })  // SUCCESS
  done()
})

(请注意,由于calledWithExactly在v7.2.2中似乎无法正确检查参数,因此我修改了测试以使用calledWithNew来检查参数)