Отделение заглушек от утверждений в rspec - PullRequest
1 голос
/ 13 марта 2012

Я использую 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, и может быть немного тонкой. Дайте мне знать, что мне нужно уточнить это!

1 Ответ

2 голосов
/ 13 марта 2012

Ты прав. should_receive является утверждением (точнее, ожиданием ) и не должно входить в блок before. Если вам нужен побочный эффект should_receive, то заглушка отдельно в вашем before:

before do
  subject.stub(:sum).and_return(6)
end

it "should do something that relies on sum" do
  subject.should_receive(:sum).once.with([1, 2, 3]).and_return(6)
  subject.call_something([1, 2, 3]).should == 24
end

Это разделяет заглушки и ожидания и то, где они принадлежат.

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