2013-10-14 4 views
0

를 사용하여 mongoid 필드를 업데이트 : 여기단위 테스트는 내가 단위 테스트에 다음 코드 노력하고 RR

require 'mongoid' 

class Seller 
    include Mongoid::Document 

    field :updated_at, type: Time 

    def update_updated_at 
    updated_at = Time.now 
    save 
    end 

end 

것은 나는 다음과 같은 오류

updated_at=(2013-10-14 00:00:00 -0600) 
Called 0 times. 
Expected 1 times. 
을 얻고있다

describe Seller do 

    describe 'update_updated_at' do 

    it 'sets updated_at to Time.now' do 
     now = Time.new(2013,10,14) 
     seller = Seller.new 
     mock(Time).now { now } 
     mock(seller).updated_at= now 
     mock(seller).save 
     seller.update_updated_at 
    end 

    end 

end 

내 시도

답변

1

Here은 현재 시간에 updated_at 속성 업데이트 레코드 인 기본 메서드입니다.

seller = Seller.first 
seller.touch # updated_at set to current time 

예를

를 들어 1,363,210은 날짜 시간은 예컨대

it 'sets updated_at to Time.now' do 
    now = Time.new(2013,10,14) 
    Timecop.freeze(now) do 
     seller = Seller.new 
     seller.save # 2013-10-14 
     seller.touch # same time 2013-10-14 
    end 
end 
+0

timecop을 소개합니다. +1 터치. – zhon

1

조롱이 조롱 할 필요가 없습니다, 시간 클래스는 간단한 시간 슈퍼 사용하기 쉽고 죽은 보석 timecop이 조롱합니다. 여기서 뭘하고 있는지 생각해보십시오 : updated_at을 설정하고 데이터베이스에 유지합니다. 그것은 일반적으로 스텁/모의 #save에 대한 코드 냄새입니다 - 당신이 할 수있는 일을하고 있다는 것을 믿을 수 있습니다. 그것은 데이터베이스에 대한 속성을 유지합니다. 따라서 메서드를 호출하고 레코드를 다시로드 한 다음 updated_at가 현재 시간으로 설정되어 있다고 주장하십시오 (메서드를 호출 할 때).

또는 단지 터치 사용, 당신은 updated_at = Time.now을 사용했기 때문에이 테스트가 실패 그런데)

을; self.updated_at = Time.now을 사용했다면 통과했을 것입니다.

+1

이것은 * 단위 테스트 *입니다. 내 단위 테스트에서 데이터베이스에 충돌하고 싶지 않습니다. ''save''를 조롱하면 데이터베이스를 치지 않고 save를 호출 할 수 있습니다. – zhon

+0

+1 문제를 해결하기 위해'''self.update_at = Time.now'''. 고맙습니다! – zhon