经过认证的RSpec测试和工厂女孩

时间:2015-02-26 17:16:31

标签: ruby-on-rails ruby unit-testing rspec devise

我正在为简单的CRUD rails应用程序编写基本测试。我正在使用设计验证和Factory Girl进行对象创建,同时测试后,我正在使用Database Cleaner gem清除test.db。

我正在使用RSpec测试一个控制器,但需要一个管理员用户登录才能进行“真正的”测试。

到目前为止,我一直在关注文档,但我认为它不起作用。

我有一个测试,检查计数是否已被一个更改:

     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

当我运行测试套件时,我收到错误:

  

预期#count已更改为1,但已更改为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

我不确定我是否正朝着正确的方向前进。我当然需要对我的控制器测试进行身份验证。

1 个答案:

答案 0 :(得分:1)

在第一个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

现在您不需要在FactoryGirl前面添加所有factory_girl方法,因此您可以只编写FactoryGirl.create而不是create