我有一个控制器创建操作,可以创建一个新的博客帖子,并在帖子成功保存时运行其他方法。
我有一个单独的工厂女孩档案,上面有我要发布的帖子的参数。 FactoryGirl.create调用ruby create方法,而不是我控制器中的create action。
如何从RSpec中的控制器调用create动作?我如何将它寄给我工厂女孩factories.rb
档中的参数?
posts_controller.rb
def create
@post = Post.new(params[:post])
if @post.save
@post.my_special_method
redirect_to root_path
else
redirect_to new_path
end
end
规格/请求/ post_pages_spec.rb
it "should successfully run my special method" do
@post = FactoryGirl.create(:post)
@post.user.different_models.count.should == 1
end
post.rb
def my_special_method
user = self.user
special_post = Post.where("group_id IN (?) AND user_id IN (?)", 1, user.id)
if special_post.count == 10
DifferentModel.create(user_id: user.id, foo_id: foobar.id)
end
end
端
答案 0 :(得分:5)
请求规范是集成测试,使用类似Capybara的东西来访问用户可能执行的页面并执行操作。您根本不会根据请求规范测试create
操作。您将访问新项目路径,填写表单,单击“提交”按钮,然后确认已创建对象。看看Railscast on request specs就是一个很好的例子。
如果要测试创建操作,请使用控制器规范。合并FactoryGirl,看起来像这样:
it "creates a post" do
post_attributes = FactoryGirl.attributes_for(:post)
post :create, post: post_attributes
response.should redirect_to(root_path)
Post.last.some_attribute.should == post_attributes[:some_attribute]
# more lines like above, or just remove `:id` from
# `Post.last.attributes` and compare the hashes.
end
it "displays new on create failure" do
post :create, post: { some_attribute: "some value that doesn't save" }
response.should redirect_to(new_post_path)
flash[:error].should include("some error message")
end
这些是您真正需要与创作相关的唯一测试。在您的具体示例中,我将添加第三个测试(同样,控制器测试)以确保创建适当的DifferentModel
记录。