我使用on Rails的3.2.2,2.9.0 Rspec的和RspecRails 2.9.0红宝石。 我想测试的create
控制器行动,但我不知道怎么做“正确的” /“正确”的方式。 我“脚手架”的模式,控制器,视图,...文件,所以这些文件我对Rails生成由红宝石产生的公共代码; 在我的规格文件我有:
it "assigns @article" do
new_article = FactoryGirl.build(:article)
Article.should_receive(:new).and_return(new_article)
post :create
assigns[:article].should eq(new_article)
end
也许,( 注 :上面的代码几乎是一样的,我用它来测试new
控制器动作) 更好的方式来测试create
控制器动作将是在传递一些属性值post :create
行动,而不是继续为我做以上 ,但我不知道如何使这一点,如果它是“正确的” /“正确”的方式让事情。
那么, 什么是测试“创造”的控制器操作的正确方法?
怎么样:
it "creates article" do
article_params = FactoryGirl.attributes_for(:article)
expect { post :create, :article => article_params }.to change(Article, :count).by(1)
end
我做这样说:
describe "#create" do
before { post :create, { "my_model"=> { "name"=>"name" } } }
specify("should created one my_model") { change{ MyModel.count }.from(0).to(1) }
end
亚伦·萨姆纳谁最近写了一本书每天Rails进行测试使用RSpec有一个在他的博客文章 。 当他描述的是这样的:
describe "POST create" do
context "with valid attributes" do
it "creates a new contact" do
expect{
post :create, contact: Factory.attributes_for(:contact)
}.to change(Contact,:count).by(1)
end
it "redirects to the new contact" do
post :create, contact: Factory.attributes_for(:contact)
response.should redirect_to Contact.last
end
end
context "with invalid attributes" do
it "does not save the new contact" do
expect{
post :create, contact: Factory.attributes_for(:invalid_contact)
}.to_not change(Contact,:count)
end
it "re-renders the new method" do
post :create, contact: Factory.attributes_for(:invalid_contact)
response.should render_template :new
end
end
end