我有群组和用户模型。用户属于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”有点复杂。但这就是想法。
答案 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
意义上)。