2011-07-17 3 views
1

내가 테스트가 실패하는 이유를 찾기 위해 노력하고 힘든 시간을 보내고 있습니다 :이상한 관계 행동 레일 3 update_attribute

describe User, "Instance Methods" do 
    describe "leave_group!" do 
    it "should set group_id to nil" do 
     @user = Factory(:user) 
     @group_2 = Factory(:group, :owner => @user) 

     @user.leave_group! 
     @user.reload.group_id.should be_nil # THIS LINE IS FAILING!!! 
    end 

    it "should assign another owner to group, if owner was user" do 
     @user = Factory(:user) 
     @group = Factory(:group, :owner => @user) 
     1.upto(4) { @group.add_user Factory(:user) } 

     @user.leave_group! 
     @group.reload.owner.should_not eql(@user) 
    end 
    end 
end 

이들은 내가 사용 모델은 다음과 같습니다

class User < ActiveRecord::Base 
    # Associations 
    has_one :own_group, :class_name => "Group", :foreign_key => "owner_id" 
    belongs_to :group 

    def leave_group! 
    current_group_id, current_group_owner = self.group.id, self.group.owner 
    self.group_id = nil 
    save! 
    Group.find(current_group_id).randomize_owner! if current_group_owner == self 
    end 
end 

class Group < ActiveRecord::Base 
    # Associations 
    has_many :users 
    belongs_to :owner, class_name: "User" 

    def randomize_owner! 
    current_users = self.users 
    return false unless current_users.length > 1 
    begin 
     new_user = current_users.sort_by { rand }.first 
    end while self.owner == new_user 
    self.owner_id = new_user.id 
    save! 
    end 
end 

내가 여기서 뭔가 잘못하고 있니? 그것을 향상시킬 수 있을까요? 더 중요한 것은 왜 그 단일 테스트가 실패 했는가?

가 여기에 하나의 테스트를들이받은에 대한 로그 출력입니다 :

SQL (0.2ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 

AREL (0.3ms) INSERT INTO "users" ("name", "uid", "provider", "email", "image_url", "group_id", "created_at", "updated_at", "timezone", "public_readings", "is_visible_on_leaderboards", "phone_number") VALUES ('John Doe', '314159265', 'facebook', '[email protected]', NULL, NULL, '2011-07-18 02:02:08.455229', '2011-07-18 02:02:08.455229', NULL, 't', 't', NULL) 
Group Load (0.1ms) SELECT "groups".* FROM "groups" WHERE "groups"."key" = 'SNYEMJ' LIMIT 1 
AREL (0.1ms) INSERT INTO "groups" ("name", "key", "score", "owner_id", "created_at", "updated_at") VALUES ('John''s Group', 'SNYEMJ', 0, 1, '2011-07-18 02:02:08.522442', '2011-07-18 02:02:08.522442') 
AREL (0.0ms) UPDATE "users" SET "group_id" = 1, "updated_at" = '2011-07-18 02:02:08.524342' WHERE "users"."id" = 1 
Group Load (0.1ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = 1 LIMIT 1 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users".group_id = 1) 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 

마지막 3 개 라인 모두를 선택하고, 통지 레일 심지어는 사용자로부터 GROUP_ID를 제거하지 않습니다. (테스트 사용자에게는 1, 테스트 그룹에는 1, 테스트 사용자에게는 group_id를 할당하는 1 개의 업데이트가 삽입됩니다.)

+0

SQL 쿼리를 포함하여 첫 번째 테스트에 대해 logs/test.log의 출력을 추가하십시오. – Thilo

+0

방금 ​​추가했습니다. 2 개의 업데이트 (사용자로부터 group_id를 제거하기위한 1 개와 그룹에 다른 owner_id를 할당하기위한 1 개)를 수행해야하더라도 레일스가 삽입 또는 업데이트를 수행하는 방법을 알 수 있습니다. – Lonecat

답변

1

한번에 시험에서 @user.leave_group 전에 @user.reload 전화를 추가.

@group_2을 공장에서 만들 때 DB의 그룹으로 사용자 레코드가 업데이트 되더라도 @user 개체가 아닌 것으로 의심됩니다. 그런 다음 leave_group!@user으로 지정하고 group ID을 nil로 지정하면 개체가 변경되지 않기 때문에 저장 작업이 수행되지 않습니다. 그런 다음 테스트의 다음 줄에 @user을 다시로드합니다. 이전에는 할당 된 DB의 group_id이 있습니다.

+0

대단히 감사합니다! 나는 @ user.leave_group을 바 꾸었습니다! ~ @ user.reload.leave_group! 그리고 효과가있었습니다! : D 나는 그것을 어떻게 놓쳤는 지 모른다. – Lonecat

0

는 다음과 같은 기회에 모델 클래스를 시도 :

class User < ActiveRecord::Base 
    # Associations 
    has_one :own_group, :class_name => "Group", :foreign_key => "owner_id" 
    belongs_to :group 

    def leave_group! 
    group_randomize_owner 
    self.group.clear 
    end 

    private 

    def group_randomize_owner 
    if group.owner == self 
     group.randomize_owner! 
    end 
    end 
end 
+0

이것은 작동하지 않습니다. self.group.clear는 실제로는 메소드가 아닌 Group # clear을 호출하려고하기 때문에 오류가 발생합니다. 그러나 이것은 다음과 같은 그룹에서 작동합니다 : @ group.users.clear 그러나 이것은 해결할 필요가없는 경우입니다. 도와 주셔서 감사합니다! – Lonecat