2013-04-26 60 views
2

我有组和用户模型。用户属于Group,Group拥有多个用户。Mongoid找不到工作?

我正在用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

绝不使用'delete' – apneadiving 2013-04-26 15:23:09

+0

哦!为什么? ...我使用Mongoid :: Paranoia模块,所以我软删除文档。 – cortex 2013-04-26 15:27:35

+0

'delete'不会触发回调。顺便说一句,我猜:'@ group_spec.valid? =>假' – apneadiving 2013-04-26 15:30:41

回答

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?来验证此情况。 ===是用于案例陈述的平等。 (有关不同比较运算符的解释,请参见here)。如果ActiveRecord具有相同的id,则认为两个记录相同(在=====意义上)。

+0

谢谢@davogones,但我得到了同样的...我没有在问题中添加它,但我必须确保用户属于同一组的帐户:'after(:create){| group,evaluator | FactoryGirl.create_list(:user,evaluator.users_count,group:group,account:group.account)}'... – cortex 2013-04-29 15:38:15

+0

我认为你的组模型应该已经自动处理了反向关系 - 这就是我将如何做到这一点。不过,我修正了代码以符合你想要的方式。 – davogones 2013-04-29 19:14:28

+0

谢谢,它的工作原理。你能告诉我,为什么'@group === @group_spec >> true',但是'@group_spec.users.size >> 2和@ group.users.size >> 0'与以前的工厂? – cortex 2013-04-29 19:45:50