Я использую rspec и библиотеку rspec mocks для создания заглушек / насмешек, но я начинаю думать, что грань между обработкой метода и утверждением, как он использовался, размыта. В своих тестах я часто пишу что-то вроде:
before(:each) do
subject.should_receive(:sum).once.with([1, 2, 3]).and_return(6)
end
it("should do something that relies on sum") do
subject.call_something([1, 2, 3]).should == 24
end
Но каковы мои утверждения? Это call_something([1, 2, 3])
:
- Возвращает
24
- Вызывает
sum([1, 2, 3])
во время выполнения
Однако есть только один блок it
- другое утверждение скрыто в определении заглушки. Другими словами, моя заглушка - тоже мое утверждение . Разве не было бы гораздо яснее разделить их и поставить явное утверждение о том, как вызывается метод с заглушкой:
before(:each) do
# set up what my stub should return for a given input
subject.may_receive(:sum).with([1, 2, 3]).and_return(6)
end
# assert how my stub was actually called
it("should have called sum with 1, 2, 3") do
# this is pseudo-rspec
subject.call_something([1, 2, 3]).should have_called(:sum).on(subject).once.with([1, 2, 3])
end
it("should do something that relies on sum") do
subject.call_something([1, 2, 3]).should == 24
end
Таким образом, очень ясно, что я утверждаю, потому что мои определения заглушки и утверждения были разделены. Я могу настроить свой тест сверху, а затем проверить его поведение внизу, не смешивая их.
Итак, мой вопрос: есть ли способ сделать это? Большинство фальшивых фреймворков работают так же, как и rspec-mocks, и определяют контракт на использование метода-заглушки вместе с ожидаемым поведением, а затем автоматически проверяют утверждение в конце.
Моя точка зрения является концептуальной о том, как работает BDD, и может быть немного тонкой. Дайте мне знать, что мне нужно уточнить это!