Mongoid找不到工作?

时间:2013-04-26 15:18:59

标签: ruby-on-rails ruby mongoid factory-bot

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

我正在使用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:“datamodel”有点复杂。但这就是想法。

1 个答案:

答案 0 :(得分: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语句的相等。 (有关不同比较运算符的说明,请参阅here。)如果两个记录具有相同的==,则它们会认为两个记录相同(在===id意义上)。