В журнале консоли sinon.spy () вместо содержимого шпиона отображается [Функция] - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь увидеть вывод sinon.spy(), но когда я делаю console.log( res.render ), я просто вижу [Function] в консоли при запуске теста.

const should = require( 'chai' ).should()
const sinon = require( 'sinon' )

const getIndex = ( req, res ) => {
  res.render( 'index' )
}

describe( 'getIndex', function () {
  it( 'should render index', function () {
    let req = {}
    let res = {
      render: sinon.spy()
    }

    getIndex( req, res )

    console.log( res.render ) // Expecting all properties from sinon.spy()
    res.render.firstCall.args[ 0 ]
      .should
      .equal( 'index' )
  } )
} )

РЕДАКТИРОВАТЬ: Я ожидал увидеть все свойства, доступные с sinon.spy().Например, свойство firstCall.args[ 0 ], но я хотел увидеть все свойства.Я знаю, что они перечислены в https://sinonjs.org/releases/v7.4.2/spies/, но я надеялся увидеть все свойства сразу, так как я пытаюсь лучше понять, как работает sinon для тестирования.

Ответы [ 2 ]

1 голос
/ 22 сентября 2019
  • При нажатии на часть function (если вы находитесь хотя бы в консоли Chrome Dev) она покажет вам содержимое кода функции, а не его результаты.
  • Это потому, чтоres.render не является строкой или числом или чем-то еще, это функция.
  • Следовательно, нам нужен какой-то способ записи результата res.render.
  • Если мы вызываем res.renderи передать ему необходимые аргументы, мы получим вывод res.render().
  • TL; DR Я бы попробовал что-то вроде console.log(res.render("index")) вместо просто console.log(res.render)
0 голосов
/ 24 сентября 2019

TL; DR

  • Шпионы - это функции.
  • Обзор консоли инструментов разработки или наблюдения не отображает свойства объектов функций.

Шпионы

Шпионы - это функции, потому что они должны использоваться в качестве прокси функций или заменять функции на объектах для отслеживания вызовов к ним.Шпион будет внутренне отслеживать вызовы, чтобы разрешить программный контроль.

Javascript

Вы можете не знать, что в функциях Javascript тоже есть объекты.

В JavaScript функцииявляются первоклассными объектами, потому что они могут иметь свойства и методы, как и любой другой объект.Что отличает их от других объектов, так это то, что функции могут быть вызваны.Вкратце, они являются объектами Function.

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

Функции могут иметь свойства, а свойства могут быть определены или настроены так же, как и для «обычных» объектов.

Причина, по которой шпион не показывает атрибуты в инспекторе ни отладчиком, ни console.log(), заключается в том, что инструменты разработчика знают, что это функция, и функции отображаются как таковые.

Devtools

Инструменты разработчика, очевидно, предполагают, что Function объекты (обычно) не имеют специальных свойств и, следовательно, не будут перечислять их.

Вы можете наблюдать это и с базовыми функциями.Введите это в консоли:

var f = function() { }
f.foo = 42;
f; // The property won't be printed

Хотя вы можете проверить шпионский объект в отладчике при остановке в точке останова.Вы бы добавили ссылку на панель «Смотреть» на вкладке «Источник».Затем вы можете открыть объект функции и проверить свойства.

После предыдущего эксперимента вы действительно можете проверить функцию, добавив выражение наблюдения для f.

Шпионский объект Sinon подпроверка:

Chrome dev tools showing details on an inspected spy

...