2

我有组和用户模型。用户属于组,组有很多用户。

我正在使用 Rspec 编写集成测试:当一个组至少有一个用户时,该组不会被删除。

工厂:

FactoryGirl.define do
  factory :group_with_users do
    name 'Demo group'

    ignore do
      users_count 2
    end

    after(:create) do |group, evaluator|
      FactoryGirl.create_list(:user, evaluator.users_count, group: group)
    end
  end
end

规格:

require 'spec_helper'

feature 'admin can manage groups' do
  background do
    @group_spec = FactoryGirl.create(:group_with_users)

    visit groups_path
  end

  scenario "don't delete group because it's not empty (there are users)" do
    page.should have_text(@group_spec.name)

    # DEBUGGING
    binding.pry

    click_link 'Delete'

    page.should have_text('Not deleted')
    page.should have_text(@group_spec.name)
  end
end

组控制器:

def destroy
  @group = Group.find(params[:id])

  # DEBUGGING
  binding.pry

  msg = if @group.users.size > 1
          'Not deleted'
        else
          @group.delete
          'Deleted'
        end

  redirect_to groups_path, notice: msg
end

问题是该组正在被删除。所以我决定调试(参见规范和控制器中的#DEBUGGING)代码。

在规格中:

@group_spec.users.size
>> 2

在控制器中:

@group.users.size
>> 0

比较两个对象:

@group === @group_spec
>> true

编辑: 在规范调试中:

Group.find(@group_spec._id).users.size
>> 0

PS:“数据模型”有点复杂。但这就是想法。

4

1 回答 1

1

我认为您在工厂中犯了一个错误,实际上并没有将任何用户放入您的组中。它应该如下所示:

FactoryGirl.define do
  factory :group_with_users do
    name 'Demo group'

    ignore do
      users_count 2
    end

    after(:create) do |group|
      group.users << FactoryGirl.create_list(:user, users_count, group: group)
    end
  end
end

您的调试会话也具有误导性,因为@group实际上@group_spec是不同的实例,这就是它们具有不同数据的原因。您可以通过检查object_id或调用来验证这一点equal?===是用于 case 语句的等式。(有关不同比较运算符的说明,请参见此处==。)如果两条记录具有相同的 ,则 ActiveRecord 认为它们相同(在和===意义上)id

于 2013-04-27T05:53:01.430 回答