問題は、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 によって作成されたオブジェクトを何らかの方法で使用する前に、初期化 (?) する必要がありますか?
他に必要なコードはありますか?