【问题标题】:Disappearing data in controller specs控制器规格中的数据消失
【发布时间】:2015-05-07 12:20:45
【问题描述】:

使用 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 方法失败。

我认为这可能与我正在使用 database_cleaner 的事实有关,但我完全不知道如何处理它以及我能做些什么。谢谢大家提供任何线索。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 其实我有一些 JS 测试
    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2013-02-01
    • 2016-05-17
    相关资源
    最近更新 更多