3

新しいブログ投稿を作成するコントローラ作成アクションがあり、投稿が正常に保存された場合は追加のメソッドを実行します。

作成したい投稿のパラメーターを含む別のファクトリーガールファイルがあります。FactoryGirl.create は、コントローラーの create アクションではなく、ruby create メソッドを呼び出します。

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   

終わり

4

1 に答える 1

5

リクエスト仕様は統合テストであり、Capybara のようなものを使用して、ユーザーがページにアクセスしてアクションを実行します。createリクエスト仕様からのアクションをまったくテストしません。新しいアイテム パスにアクセスし、フォームに入力して [送信] ボタンをクリックし、オブジェクトが作成されたことを確認します。Railscast on request の仕様を見て、素晴らしい例を見てみましょう。

作成アクションをテストする場合は、コントローラー スペックを使用します。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レコードが作成されることを確認するために、3 番目のテスト (再度、コントローラー テスト) を追加します。

于 2013-05-14T04:13:29.590 に答える