3

問題は、Rspec で factory girl を正しく使用する方法がわからないことだと思います。または、レールで正しくテストします。それでも少し変だと思いますが..

次のファクトリを持つクラス User があります。

FactoryGirl.define do
  factory :user do
    name     "admin"
    email    "admin@admin.com"
    adminstatus  "1"
    password "foobar"
    password_confirmation "foobar"
  end

  factory :user_no_admin, class: User do
    name     "user"
    email    "user@user.com"
    adminstatus  "2"
    password "foobar"
    password_confirmation "foobar"
  end
...

私のテストは次のようになります。

...
describe "signin as admin user" do
  before { visit login_path }
  describe "with valid information" do
    let(:user_no_admin) { FactoryGirl.create(:user_no_admin) }
    let(:user) { FactoryGirl.create(:user) }
    before do
      fill_in "User",    with: user.name
      fill_in "Password", with: user.password
      click_button "Login"
    end

    it "should list users if user is admin" do 
      response.should have_selector('th', content: 'Name') 
      response.should have_selector('td', content: user_no_admin.name)
      response.should have_selector('td', content: user.name)
    end
  end      
end#signin as admin user
...

基本的に、管理者としてログインすると、すべてのユーザーのリストが表示されることをテストしようとしています。後でファイルに非管理者としてログオンするためのテストがあります。データベースにはすでに数人のユーザーがいます。

ログインしたユーザー「admin」のリストには、すでにデータベースに存在するユーザーとともに表示されます。ただし、以前に次のようなことをしない限り、「ユーザー」は表示されません。

fill_in "User",    with: user_no_admin.name
fill_in "Password", with: user_no_admin.password

使わなければ存在しないに等しい。ただし、プットを使用すると、上記の「fill_in」を実行しなくても、プットしている情報が出力されます。

puts が役立つ同様の例があります。

describe "should have company name" do
  let(:company) { FactoryGirl.create(:company) }
  let(:category) { FactoryGirl.create(:category) }
  let(:company_category) { FactoryGirl.create(:company_category, company_id: company.id, category_id: category.id) }
  it "should contain companies name" do
    puts company_category.category_id
    get 'categories/' + company.categories[0].id.to_s
    response.should have_selector('h4', :content => company.name)
  end
end

上記のプットがなければ、

Called id for nil

Factory girl によって作成されたオブジェクトを何らかの方法で使用する前に、初期化 (?) する必要がありますか?

他に必要なコードはありますか?

4

4 に答える 4

8
let(:whatever) 

オブジェクトを初めて呼び出すまでオブジェクトを作成しません。最初に使用する前に利用可能にしたい場合は、

let!(:whatever)

代わりは。

または before ブロックを使用します。

before(:each) do
  @company = FactoryGirl.create(:company)
  ....
end

オブジェクトを使用する前にオブジェクトを作成します。

于 2012-06-26T11:15:13.683 に答える
1

それ以外の:

factory :user do
  name     "admin"
  email    "admin@admin.com"
  ...

私がします:

factory :user do |f|
  f.name "admin"
  f.email "admin@admin.com"
  ...

それ以外の:

let(:user_no_admin) { FactoryGirl.create(:user_no_admin) }
let(:user) { FactoryGirl.create(:user) }

私がします:

@user_no_admin = Factory(:user_no_admin)
@user = Factory(:user)
于 2012-06-26T11:08:14.317 に答える