Принцип СУХОГО гласит: «Каждое знание должно иметь одно, однозначное, авторитетное представление в системе».То, что вы делаете, - это гораздо больше о сохранении нескольких символов здесь и там, чем о сохранении СУХОГО, и в результате получается запутанная паутина зависимостей вверх и вниз по иерархии, которая, как вы можете видеть, является сукой, чтобы сделать то, чтовы хотите, и, следовательно, хрупкие и хрупкие.
Давайте начнем с того, что вы написали многословно и работает:
describe MyController do
describe "GET #show" do
context "published item" do
it "redirects to the success url" do
item = Factory(:item, published: true)
get :show, :id => item.id
response.should redirect_to success_url
end
end
context "unpublished item" do
it "redirects to the error url" do
item = Factory(:item, published: false)
get :show, :id => item.id
response.should redirect_to error_url
end
end
end
end
Теперь единственные «знания»«дублируются имена примеров, которые могут быть сгенерированы сопоставителями в конце каждого примера.Это можно решить читабельным способом, используя метод example
, который имеет псевдоним it
:
describe MyController do
describe "GET #show" do
context "published item" do
example do
item = Factory(:item, published: true)
get :show, :id => item.id
response.should redirect_to success_url
end
end
context "unpublished item" do
example do
item = Factory(:item, published: false)
get :show, :id => item.id
response.should redirect_to error_url
end
end
end
end
Там.DRY.И вполне читабельно и легко изменить.Теперь, когда вам случится добавить больше примеров для любого из контекстов, вы можете добавить let
:
describe MyController do
describe "GET #show" do
context "published item" do
let(:item) { Factory(:item, published: true) }
example do
get :show, :id => item.id
response.should redirect_to success_url
end
example do
# other example
end
end
# ...
end
end
Теперь единственным дублированным кодом (не таким, как принцип DRY) является get
.Если вы действительно сильно к этому относитесь, вы можете делегировать эти вызовы методу, подобному get_show(id)
, или тому подобному, но на данный момент он не слишком много покупает.Это не значит, что API для get
изменится из-за вас, и единственный аргумент для get
- это идентификатор item
, который вам действительно важен в примере (так что нет лишней информации).
Что касается использования subject
для захвата ответа и получения однострочников из сделки, то это просто делает вещи действительно трудными для чтения и не сильно вас экономит.На самом деле, я решил подумать об использовании subject
таким образом , чтобы быть запахом .
Надеюсь, это все поможет.
Приветствия, Дэвид