在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>
答案 0 :(得分:4)
当您定义factory(:admin)
时,FactoryGirl会查找名为Admin
的类,这就是您收到该错误的原因。
您无需为admin
创建单独的工厂;你可以简单地使用你的用户工厂,传入admin: true
(这将覆盖默认的出厂设置)。 admin = Factory(:user, admin: true)
也是。user
。确保当然已定义:admin
工厂。
如果要保留User
工厂,则需要指定该类为factory(:admin, class: "User")
。语法如下:{{1}}。