3

我有一个控制器创建操作,它创建一个新的博客文章,如果文章保存成功,则运行一个附加方法。

我有一个单独的工厂女孩​​文件,其中包含我要发布的帖子的参数。FactoryGirl.create 调用 ruby​​ create 方法,而不是我的控制器中的 create 操作。

如何从我的 RSpec 中的控制器调用创建操作?我如何将我的工厂女孩factories.rb​​文件中的参数发送给它?

post_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   

结尾

4

1 回答 1

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创建适当的记录。

于 2013-05-14T04:13:29.590 回答