Я тестирую код, который создает экземпляр объекта из внешней библиотеки.Чтобы сделать этот тестируемый, я решил ввести зависимость:
Сводится к:
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
? Еслиитак, как?