控制器规格中消失的数据

时间:2015-05-07 12:20:45

标签: ruby-on-rails ruby rspec database-cleaner

使用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这样的东西。它是这样的:

    正在创建
  1. user(使用company,它是依赖项),该用户的ID 1 ,并且使用该用户创建的公司的ID是也 1
  2. 第二次测试被触发,一切都很好
  3. 第一次测试被触发,但数据库中没有ID为1的Company,有一个ID = 2的新的,这显然是错误的,导致我的set_company方法失败。 / LI>

    我认为这可能与我使用database_cleaner这一事实有关,但我完全不知道如何处理它以及我该怎么办呢。谢谢大家的任何线索。

1 个答案:

答案 0 :(得分:0)

如果您还没有基于JavaScript的测试,那么就不需要database_cleaner。只要启用了事务性灯具,就会在每次测试之间自动清除数据。