Ответ 1
Я бы предложил DRYing его, переопределив тему теста (и используя stabby lambdas для удовольствия):
describe "recipe creation" do
subject { -> { click_button submit } }
it { should change(Recipe, :count).by(1) }
it { should change(Ingredient, :count).by(1) }
end
Обновить. Хотя он может выглядеть менее сухим, в наши дни я бы, вероятно, продолжал использовать синтаксис expect
, так как он рекомендуется и я вообще удаляюсь от should
, но, возможно, сделаю некоторые незначительные изменения для удобочитаемости spec:
describe "recipe creation" do
let(:creating_a_recipe) { -> { click_button submit } }
it "changes the Recipe count" do
expect(creating_a_recipe).to change(Recipe, :count).by(1)
end
it "changes the Ingredient count" do
expect(creating_a_recipe).to change(Ingredient, :count).by(1)
end
end
Примечание: вы можете видеть в документации RSpec для change
-сервера, в которой expect
используются фигурные скобки. Это, конечно, правильно, но причина, по которой стандартная скобка работает в этом примере, заключается в том, что код, изменяющий изменчивое состояние (содержится в creating_a_recipe
), находится в лямбда, который вызывается при передаче в expect
в качестве параметра.
Независимо от этого, в этом случае можно успешно использовать expect(creating_a_recipe)
или expect { creating_a_recipe }
, и в зависимости от того, какой вы используете, это зависит от личных предпочтений.