Передача контекста в фальшивую функцию заглушки Sinon - PullRequest
0 голосов
/ 04 марта 2019

Я использую репортер mochawesome для своих тестов мокко.Я бы хотел, чтобы он также записывал мою запись в журнал и присоединял ее к любому тесту, который выполнялся на момент написания журнала.Это может быть достигнуто с addContext().Однако я также хочу, чтобы журналы выводились на консоль, поэтому я могу отслеживать их во время выполнения теста, а не ждать, пока он все завершит и отчет будет сгенерирован.

IУ меня 98% решения, основанного на этом ответе , но я борюсь из-за того, что mochawesome addContext() требует, чтобы вы передали ему тестовый объект.Вот что у меня есть:

beforeEach(`Spy on logger`, function() {
  const origLogInfo = logger.info.bind(logger),
    origLogError = logger.error.bind(logger),
    testContext = this

  sinon.stub(logger, 'info').callsFake(function(message) {
    addContext(testContext, `INFO: ${message}`)
    origLogInfo.call(testContext, message)
  })

  sinon.stub(logger, 'error').callsFake(function(message) {
    addContext(testContext, `ERROR: ${message}`)
    origLogError.call(testContext, message)
  })
})

afterEach(`Remove stubs`, function() {
  logger.info.restore()
  logger.error.restore()
})

it('counts approved hours', async function() {
      logger.info(`Approving timesheets...`)
        ...

Итак, перед каждым it() я получаю ссылку на оригинальные функции logger.info() и logger.error(), а затем заглушаю их.Заглушка вызывает функцию, которая вызывает функцию mochawesome addContext(), передавая ей ссылку на beforeEach() и любую строку, которую я отправил logger.info().Затем вызывается оригинал.

Моя проблема в том, что каждый раз, когда вызывается addContext(), он прикрепляет журналы к хуку beforeEach().Я тоже понимаю, почему это происходит.Пошаговое выполнение кода показывает, что при выполнении beforeEach(), this имеет два свойства: currentTest и test.Первый относится к it(), который должен быть вызван, а второй - к самому beforeEach() хуку.Это замечательно!Если бы оно оставалось таким, addContext() взял бы currentTest и приложил к нему логи ( ссылка на источник ).

К тому времени, когда вызывается аргумент callsFake()однако тот же объект утратил свое свойство currentTest, поэтому addContext() вместо этого присоединяет журналы к самому хуку beforeEach().В результате получается отчет о тестировании со всеми журналами, прикрепленными к хуку beforeEach вместо соответствующих тестов.

Можно ли как-то написать это, чтобы аргумент callsFake() содержал ссылку на тест, который logger.info был вызван с?Следующее работает, но требует дополнительного кода внутри каждого it():

boundLoggerInfo = logger.info.bind(this);
boundLoggerInfo(`Approving timesheets...`)

Ура!Надеюсь, я предоставил достаточно информации, не будучи слишком подробным ...

1 Ответ

0 голосов
/ 05 марта 2019

Обновление: мне удалось обойти эту проблему и добиться того, что я хотел, после хорошего сна:

testContext = {
  currentTest: this.currentTest
}

Теперь ссылка на currentTest сохраняется даже после того, как beforeEach() потеряет его (все еще не уверен, почему это происходит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...