使用 Rspec 创建一个简单的控制器规范时,我遇到了一个非常恼人的问题。调用引起问题的方法#set_company
,它为当前登录的用户设置一个父“帐户”。
def set_company
return false if !user_signed_in?
current_company = Company.find(current_user.company_id)
set_current_tenant(current_company)
end
我的规格看起来像这样:
require 'spec_helper'
describe Api::V3::UsersController, :type => :controller do
describe 'GET #index' do
let(:user) { FactoryGirl.create(:user) }
let(:company) { user.company }
before {
allow(controller).to receive(:current_user) {user}
allow(controller).to receive(:current_tenant) {company}
}
it 'returns 200' do
get :index
expect(response.code.to_i).to eq 200
end
it 'assigns @users' do
get :index
expect(assigns(:users)).to eq [user]
end
end
end
问题是,第二个测试是绿色的,但第一个不是(这个顺序是正确的!)。它是红色的,这是因为当它被触发时,没有company
. 事情是这样的:
user
正在创建(使用company
,它是一个依赖项),该用户的 ID 为1,与该用户创建的公司的 ID 也是1- 第二次测试被触发,一切都很好
- 第一个测试被触发,但数据库中没有
Company
ID=1,有一个 ID=2 的新测试显然是错误的,导致我的set_company
方法失败。
我认为这可能与我正在使用 database_cleaner 的事实有关,但我完全不知道如何处理它以及我能做些什么。谢谢大家的任何线索。