我正在测试从外部库实例化对象的代码。为了使其可测试,我决定注入依赖项:
归结为:
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
之类的其他函数吗? ,如何?
答案 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
来检查参数)