经过身份验证的 RSpec 测试和工厂女孩
Authenticated RSpec testing and Factory Girl
我正在为一个简单的 CRUD rails 应用程序编写基本测试。我在测试时使用 devise 进行身份验证,使用 Factory Girl 进行对象创建,测试后我正在使用数据库清理器 gem.
清除 test.db
我正在使用 RSpec 测试控制器,但需要管理员用户登录才能进行 'true' 测试。
到目前为止,我一直在关注文档,但我认为它没有用。
我有一个测试,检查计数是否已经改变了一个:
describe "POST create" do
context "with valid attributes" do
it "creates a new room" do
expect{ post :create, room: FactoryGirl.attributes_for(:room) }.to change(Room,:count).by(1)
end
当我 运行 测试套件时,我得到错误:
expected #count to have changed by 1, but was changed by 0
通过阅读,我似乎需要为我的测试设置身份验证。为此,我创建了相关工厂:
# Devise User Class
factory :user do
email "basicuser@mvmanor.co.uk"
password "u"
password_confirmation "u"
admin false
customer false
end
# Admin
factory :admin, class: User do
email "basicadmin@mvmanor.co.uk"
password "a"
password_confirmation "a"
admin true
customer false
end
我还创建了相关的 Devise 映射宏:
module UserControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in FactoryGirl.create(:admin) # Using factory girl as an example
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in FactoryGirl.create(:user) # Using factory girl as an example
end
end
end
我不确定我是否正朝着正确的方向前进。我当然需要对我的控制器测试进行身份验证。
在第一个 describe
语句之前添加:
let!(:admin) { FactoryGirl.create(:admin) }
before { subject.stub(current_user: admin, authenticate_user!: true) }
它应该存根您的身份验证。
还有一个让您开心的小技巧:在
中的任意位置添加您的 spec_helper.rb
RSpec.configure do |config|
...
end
阻止此代码:
config.include FactoryGirl::Syntax::Methods
现在您不需要在所有 factory_girl 方法前加上 FactoryGirl
,因此您可以只写 create
.[=18= 而不是 FactoryGirl.create
]
我正在为一个简单的 CRUD rails 应用程序编写基本测试。我在测试时使用 devise 进行身份验证,使用 Factory Girl 进行对象创建,测试后我正在使用数据库清理器 gem.
清除 test.db我正在使用 RSpec 测试控制器,但需要管理员用户登录才能进行 'true' 测试。
到目前为止,我一直在关注文档,但我认为它没有用。
我有一个测试,检查计数是否已经改变了一个:
describe "POST create" do
context "with valid attributes" do
it "creates a new room" do
expect{ post :create, room: FactoryGirl.attributes_for(:room) }.to change(Room,:count).by(1)
end
当我 运行 测试套件时,我得到错误:
expected #count to have changed by 1, but was changed by 0
通过阅读,我似乎需要为我的测试设置身份验证。为此,我创建了相关工厂:
# Devise User Class
factory :user do
email "basicuser@mvmanor.co.uk"
password "u"
password_confirmation "u"
admin false
customer false
end
# Admin
factory :admin, class: User do
email "basicadmin@mvmanor.co.uk"
password "a"
password_confirmation "a"
admin true
customer false
end
我还创建了相关的 Devise 映射宏:
module UserControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in FactoryGirl.create(:admin) # Using factory girl as an example
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in FactoryGirl.create(:user) # Using factory girl as an example
end
end
end
我不确定我是否正朝着正确的方向前进。我当然需要对我的控制器测试进行身份验证。
在第一个 describe
语句之前添加:
let!(:admin) { FactoryGirl.create(:admin) }
before { subject.stub(current_user: admin, authenticate_user!: true) }
它应该存根您的身份验证。
还有一个让您开心的小技巧:在
中的任意位置添加您的spec_helper.rb
RSpec.configure do |config|
...
end
阻止此代码:
config.include FactoryGirl::Syntax::Methods
现在您不需要在所有 factory_girl 方法前加上 FactoryGirl
,因此您可以只写 create
.[=18= 而不是 FactoryGirl.create
]