1

在 Rails 中,我有一个 before_filter 来检查并要求用户是控制器中某些操作的管理员。

但是,我需要为这些控制器编写测试。

所以,我有一些看起来像这样的东西:

test "should get create" do
    assert_difference('Event.count') do
      post :create, FactoryGirl.build(:event)
    end
    assert_not_nil assigns(:event)
    assert_response :success
  end 

用户工厂.rb:

FactoryGirl.define do

  factory :admin do
   email 'aa@example.com'
   password 'password'
   password_confirmation 'password'
   admin true
  end
end

但需要以管理员身份登录才能创建事件。关于如何做到这一点的任何想法?admin 列只是 users 表中的 true/false 列。

编辑:第一次尝试:

 test "should get create" do
    admin = Factory(:admin)
    login_as(admin)
    assert_difference('Event.count') do
      post :create, FactoryGirl.build(:event)
    end
    assert_not_nil assigns(:event)
    assert_response :success
  end

产生错误:

 1) Error:
test_should_get_create(EventsControllerTest):
NameError: uninitialized constant Admin

更新:

FactoryGirl.define do

  factory :user do
   email 'aa@example.com'
   password 'password'
   password_confirmation 'password'
  end
end

test "should get create" do
    login_as(FactoryGirl.create(:user, admin: true))
    assert_difference('Event.count') do
      post :create, FactoryGirl.build(:event)
    end
    assert_not_nil assigns(:event)
    assert_response :success
  end

我得到了错误test_should_get_create(EventsControllerTest): NoMethodError: undefined method 'login_as' for #<EventsControllerTest:0x007fb4faec1b28>

4

1 回答 1

4

当您定义您的factory(:admin)时,FactoryGirl 会查找一个名为 的类Admin,这就是您收到该错误的原因。

您无需为admin;创建单独的工厂。您可以简单地使用您的用户工厂,传入admin: true(这将覆盖默认的工厂设置)。就这样吧admin = Factory(:user, admin: true)。当然,请确保您user定义了工厂。

如果要保留:admin工厂,则需要指定类为User. 语法是这样的:factory(:admin, class: "User").

于 2012-08-19T22:33:45.630 回答