我正在使用 Ruby on Rails 3.2.2、Rspec 2.9.0 和 RspecRails 2.9.0。我想测试一下create
控制器操作,但我不知道如何使其成为“正确”/“正确”的方式。我“搭建”了模型、控制器、视图……文件,因此在这些文件中我拥有由 Ruby on 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
Maybe, (note:上面的代码与我用来测试的几乎相同new
控制器动作)更好的测试方法create
控制器操作将是在期间传递一些属性值post :create
采取行动而不是像我上面那样继续,但我不知道如何做到这一点,也不知道这是否是“正确”/“正确”的制作方法。
So, 测试“创建”控制器操作的正确方法是什么?
我这样做:
describe "#create" do
before { post :create, { "my_model"=> { "name"=>"name" } } }
specify("should created one my_model") { change{ MyModel.count }.from(0).to(1) }
end
最近写这本书的亚伦·萨姆纳使用 RSpec 进行日常 Rails 测试 http://leanpub.com/everydayrailsrspec有一个文章在他的博客上 http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html。他是这样描述的:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)