Как я могу проверить, что конструктор класса вызывается с правильными атрибутами в Sinon? - PullRequest
0 голосов
/ 13 декабря 2018

Я тестирую код, который создает экземпляр объекта из внешней библиотеки.Чтобы сделать этот тестируемый, я решил ввести зависимость:

Сводится к:

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 голосов
/ 14 декабря 2018

Вы действительно близки.

В случае вашего самого простого примера вам просто нужно создать 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 для проверки аргументов, поскольку calledWithNew, похоже, не проверяет аргументы должным образом в v7.2.2)

...