いくつかの RSpec コントローラー テストがあります。うまくいくものもあれば、うまくいかないものもあり、私は地球上でそれらを修正してより効率的にする方法を見つけようとしています
理想的には、各仕様を次の形式にできるかどうかを確認したいと思います
subject { ... }
it { ... }
it { ... }
it { ... }
すべてのコントローラー仕様について、実際のコントローラー アクション用のマクロを作成したことに注意してください。マクロはすべてテスト済みで、すべて動作します。名前から、その機能がかなり明確になります。
私の「作成」テスト:
formats ||= ["html", "js"]
formats.each do |format|
context "valid attributes" do
subject { do_post_create( :customer, valid_attributes, format ) }
its(:response_code) { should eq(302)}
it { should redirect_to admin_customer_path(Customer.find_by_id(???))}
it { expect { subject }.to change(Customer, :count).by(1) }
end
context "invalid attributes" do
subject { do_post_create( :customer, invalid_attributes, format ) }
its(:response_code) { should eq(200)}
it { should render_template :new }
it { expect { subject }.to_not change(Customer, :count).by(1) }
end
end
その仕様では、post ステートメントから新しく作成されたオブジェクトの ID を取得する方法を見つけようとしています。「Customer.last」を試してみましたが、うまくいかないようです。何かご意見は?
私の「更新」仕様:
formats ||= ["html", "js"]
formats.each do |format|
context "valid attributes" do
let(:object) { FactoryGirl.create(:customer) }
subject { do_put_update( class_to_symbol(model), object.id, attributes, format ) }
its(:response_code) { should eq(302)}
it "does alter #{model}" do
do_put_update( class_to_symbol(model), object.id, attributes, format )
assigns(:customer).should eq(object)
flash[:notice].should =~ /Success/
object.reload
attributes.each do |key, value|
object.send(key.to_s).should eq(value)
end
end
end
context "invalid attributes" do
let(:object) { FactoryGirl.create("customer") }
let(:invalid_attributes) { {:username => "!"} }
subject { do_put_update( class_to_symbol(model), object.id, invalid_attributes, format ) }
its(:response_code) { should eq(200)}
it "does not alter #{model}" do
do_put_update( class_to_symbol(model), object.id, invalid_attributes, format )
assigns(:customer).should eq(object)
flash[:notice].should =~ /Fail/
object.reload
attributes.each do |key, value|
object.send(key.to_s).should_not eq(value)
end
end
end
end
Update テストでは、2 番目のブロックをより簡潔な方法で、理想的にはすべてのテストで同じ「対象」ステートメントを使用できる方法で表現したいと思います。それは可能ですか?