如何使用测试单元登录Rails中的用户

时间:2012-08-19 22:04:53

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

在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 

user_factory.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>

1 个答案:

答案 0 :(得分:4)

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

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

如果要保留User工厂,则需要指定该类为factory(:admin, class: "User")。语法如下:{{1}}。