tl;dr
Как вы создаете object.method() «с нуля» в sinon?
контекст
Например, у меня есть семейство классов Parser
, каждый из которых реализует метод #parse(text)
и возвращает объект ParseTree
или возвращает null
.
Я выполняю модульное тестирование, где я не тестирую сами объекты Parser
(они тестируются в другом месте), но мне нужен тестируемый объект, который отвечает на #parse()
. Я мог бы создать и заглушить настоящий синтаксический анализатор, но это затянет ненужный код в эту часть теста.
вопрос
Я почти уверен, что это легко сделать с помощью API-интерфейсов sinon spy(), stub() и/или mock(), поэтому: как мне создать тестируемый объект, который:
- отвечает на метод parse()
- проверяет, что он вызывается один раз
- возвращает произвольный объект, который я указываю?
что я пробовал
В следующем надуманном примере происходит сбой при вызове sinon.stub()
, поскольку объект sinon.spy()
не может быть заглушен методом parse
. (Этот пример также должен подтвердить, что fake_parser.parse()
был вызван один раз с test_text
, но это не так):
var test_text = 'any text'
var fake_parse_tree = sinon.spy()
var fake_parser = sinon.stub(sinon.spy(), 'parse').returns(fake_parse_tree)
expect(fake_parser.parse(test_text)).to.equal(fake_parse_tree)