FactoryGirl序列打破了我的rspec测试(我认为)

时间:2013-08-23 00:37:11

标签: ruby-on-rails ruby rspec factory-bot

所以我在这里使用Rails 4创建一个Web应用程序,如果它有助于我使用Mountain Lion在Mac上,使用Aptana Studio 3进行开发。

我正在尝试创建一个页面,列出并分页我的应用程序的用户。我正在使用will_paginate和bootstrap-will_paginate来做到这一点。当我使用我的数据库上的示例用户运行rails服务器时它非常有效,但是当我使用RSpec和FactoryGirl运行我的测试时,我对所有需要用户授权的页面的测试都无法正常工作。所以这就是为什么我认为问题是FactoryGirl。

以前,我的factories.rb看起来像这样,因为它只需要创建一个用户:

FactoryGirl.define do
  factory :user do
    username "example_user"
    password "foobar"
    password_confirmation "foobar"
  end
end

现在我改变了它:

FactoryGirl.define do
  factory :user do
    sequence(:username)  { |n| "Person_#{n}" }
    password "foobar"
    password_confirmation "foobar"
  end
 end

以下是我的user_pages_spec文件的更改。在测试停止传递之前,这是我在工厂文件之外唯一改变的东西。这是它的差异:

   describe "index" do
-    before do
-      sign_in FactoryGirl.create(:user)
-      FactoryGirl.create(:user, username: "bananarama")
-      FactoryGirl.create(:user, username: "appleface")
+    let(:user) { FactoryGirl.create(:user) }
+    before(:each) do
+      sign_in user
       visit users_path
     end

     it { should have_title('All users') }
     it { should have_content('All users') }

-    it "should list each user" do
-      User.all.each do |user|
-        expect(page).to have_selector('li', text: user.username)
+    describe "pagination" do
+
+      before(:all) { 30.times { FactoryGirl.create(:user) } }
+      after(:all)  { User.delete_all }
+
+      it { should have_selector('div.pagination') }
+
+      it "should list each user" do
+        User.paginate(page: 1).each do |user|
+          expect(page).to have_selector('li', text: user.username)
+        end
       end
     end
   end

缺少什么?还有什么我应该看的吗?同样,失败的测试是关于授权的页面上的测试。这些包括我的authorization_pages_spec.rb中的一些

非常感谢!

2 个答案:

答案 0 :(得分:5)

我自己修复了它!

我认为当被要求在不同的测试中使用相同的FactoryGirl序列时,工厂女孩一定感到困惑。

我刚刚使用了我的旧工厂,但添加了一个名为username的单独序列。每次我需要多个用户时,我使用该序列覆盖默认用户名。基本上是:

FactoryGirl.define do
  sequence(:username) { |n| "Person#{n}" }

  factory :user do
    username "example_user"
    password "foobar"
    password_confirmation "foobar"
   end
 end

我像往常一样创建了单个用户,然后为多个用户创建了以下内容:30.times { FactoryGirl.create(:user, username: FactoryGirl.generate(:username)) }

希望这可以帮助将来的某个人(:

答案 1 :(得分:3)

可能更容易做到

FactoryGirl.define do
  sequence(:username) { |n| "Person#{n}" }

  factory :user do
    username
    password "foobar"
    password_confirmation "foobar"
  end
end

然后

FactoryGirl.create(:user)

获取用户名和

FactoryGirl.create(:user, username: "some_name")

当您想要自定义时。