Вы должны рассмотреть вопрос о принятии нового стиля для однострочников.Например, сделайте что-то вроде этого
describe "should be able to" do
it "access index" { get :index }
it "show deal" { get :show, :id => @deal }
after(:each) { response.should be_success }
end
Также вы можете подумать о создании настраиваемого сопоставителя для повторяющихся многострочных ожиданий.Например, следующее:
after(:each) do
response.should_not be_success
response.should redirect_to(root_path)
flash[:error].should == flash
end
можно заменить на
after(:each) { response.should fail_redirect_and_flash(root_path, 'Permission denied.') }
, используя следующий пользовательский код сопоставления
RSpec::Matchers.define :fail_redirect_and_flash do |path,flash|
match do |response|
response.should_not be_success
response.should redirect_to(path)
flash[:error].should == flash
end
end
Кроме того, многие люди даже нене стоит писать модульные тесты контроллеров, потому что в хорошо спроектированных контроллерах, как правило, очень мало кода (они обычно просто устанавливают некоторые переменные, используя методы в модели, и выполняют рендеринг / перенаправление, следовательно, большая часть тестирования фактически происходит в моделях).Вместо этого они обертывают оба контроллера и рассматривают тесты вместе и используют огурец.Вы по-прежнему сталкиваетесь с таким же уродливым беспорядком кода, но некоторые люди находят, что им легче управлять.
На этой заметке вы увидите, что ваша спецификация "не должна видеть элементы управления торговцами для других сделок."на самом деле проверяет ваш взгляд, а не столько ваш контроллер.Вам, вероятно, следует извлечь любую логику, которую вы используете в своем контроллере, чтобы показать элементы управления торговцами, вставить ее в помощника и протестировать в изоляции.Это поможет сохранить ваши контроллеры тонкими.Например, у вас может быть следующий помощник, который вы используете в своих представлениях
def merchant_controls(deal, business)
if business.can? :update, deal
# render html
end
end
И у вас может быть спецификация только для этого вспомогательного метода ...
Describe "merchant_controls(deal, business)" do
before(:all) do
@business_a = create(:business)
@deal_a = create(:deal, :business_id => @business_a)
@business_b = create(:business)
@deal_b = create(:deal, :business_id => @business_b)
end
it "a business should see merchant controls next to its own deals" do
merchant_controls(@business_a, @deal_a).should eq("blahblah")
end
it "a business should not see merchant controls next to other business' deals" do
merchant_controls(@business_a, @deal_b).should eq("")
end
end
Надеюсь, это поможет.