1

RSpec、FactoryGirls でコントローラーをテストしています。
それは私の工場です.rb

FactoryGirl.define do
  factory :user do |user|
    user.sequence(:name) { Faker::Internet.user_name }
    user.email Faker::Internet.email
    user.password "password"
    user.password_confirmation "password"
  end

  factory :article do
    user
    title Faker::Lorem.sentence(5)
    content Faker::Lorem.paragraph(20)
  end
end

ここでユーザーの記事を作成するにはどうすればよいですか?
これはarticles_controller_specです

 describe ArticlesController do
      let(:user) do
        user = FactoryGirl.create(:user)
        user.confirm!
        user
      end

      describe "GET #index" do
        it "populates an array of articles of the user" do
          #how can i create an article of the user here
          sign_in user
          get :index
          assigns(:articles).should eq([article])
        end

        it "renders the :index view" do
          get :index
          response.should render_template :index
        end
      end
    end
4

3 に答える 3

1

既に記事を含む User ファクトリを指定できます

FactoryGirl.define do
  factory :user do |user|
    user.sequence(:name) { Faker::Internet.user_name }
    user.email Faker::Internet.email
    user.password "password"
    user.password_confirmation "password"
  end

  factory :article do
    user
    title Faker::Lorem.sentence(5)
    content Faker::Lorem.paragraph(20)
  end

  trait :with_articles do
    after :create do |user|
      FactoryGirl.create_list :article, 2, :user => user
    end
  end
end

次に、コントローラーテストで

FactoryGirl.create :user, :with_articles # => returns user with 2 articles

アップデート

ユーザーごとにすべての記事を表示したいと思います..その場合は使用します

get :index, {:id => user.id}

そうすれば、ユーザーを探して、コントローラー内のすべての記事を取得できます

@user = User.find(params[:id]);
@articles = @user.articles

そうでない場合は、ただやっているだけです

@articles =  Article.all

を使用した後trait :with_articles、少なくとも 2 を表示する必要がありますArticles

これは、expect(@article.size).to eq(2) のような単純なアサートでテストできます。

于 2013-04-24T13:45:24.847 に答える