2013-04-26 4 views
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.users.size 
>> 0 

두 객체 비교 : 컨트롤러

@group_spec.users.size 
>> 2 

하지만 :

사양에서

@group === @group_spec 
>> true 

EDIT : 사양 디버깅 :

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

추 신 : "datamodel"은 좀 더 복잡합니다. 그러나 그것은 그 아이디어입니다.

+0

절대 사용하지 마십시오 '삭제' – apneadiving

+0

오! 왜? ... 나는 Mongoid :: Paranoia 모듈을 사용하고 있으므로 문서를 부드럽게 제거하고 있습니다. – cortex

+0

'delete'는 콜백을 트리거하지 않습니다. btw, 나는 추측한다 :'@ group_spec.valid? => false' – apneadiving

답변

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,하지만 같은있어 ... 나는 질문에 그것을 추가하지 않았지만 사용자가 동일한 그룹의 계정에 속하는지 확인해야합니다 :'(: create) {| group, evaluator | FactoryGirl.create_list (: user, evaluator.users_count, group : group, account : group.account)} ... ... – cortex

+0

그룹 모델이 역관계를 자동으로 처리해야한다고 가정 했으므로 그렇게했을 것입니다. 그럼에도 불구하고 코드를 수정하려는 방식에 맞게 코드를 수정했습니다. – davogones

+0

감사합니다. 작동합니다. 당신은 왜'@group === @group_spec >> true'라고 말할 수 있습니까?하지만 이전 그룹의 공장에서는'@group_spec.users.size >> 2와 @group.users.size >> 0'을 말할 수 있습니까? – cortex

관련 문제