2012-02-02 5 views
1

당신은 당신이 자신의 존재를 판정하는 속성의 목록을 가지고 다음과 같은 경우 :RSpec에 테스트 : 그것은 {respond_to한다()}

before do 
    @attr = Employee.new(name: "One", 
         email: "[email protected]") 
end 

subject { @attr } 

it { should respond_to(:name) } 
it { should respond_to(:email) } 

it { should be_valid } 

할 수 있습니다 반대에 대한 다음 테스트, 즉 경우 이러한 특성을 사용하여 비어 있습니다 :

it { should_not respond_to(:reverse, :blank) } 
it { should_not be_valid } 

내가 위를 시도했지만 난 this discussion을 읽은 후, 모든 것을 잘 문제를 이해하지 않습니다.

누군가가 동일한 초기화를 사용하여 현재 상태를 테스트 한 다음 돌아서 빈 특성을 테스트하는 방법을 알고 있습니까? 사용자 개체에

+0

여기 정확히 테스트하려고합니까? 무언가가 메소드에 응답하고 그 메소드의 리턴 값이 공백인지 테스트하는 것은 분리 된 개념입니다. –

답변

21

난 당신이 respond_to이 테스트에서 무엇을 오해했다고 생각 : 당신의 존재에 대한 검증이 있다면 이러한 테스트는 좋은 것입니다. 당신은 당신이 @attr.respond_to(:name) 반환 true이 방법이 존재 함을 의미하는 것으로 주장하고

it { should respond_to(:name) } 

을 수행 할 때, 그것은 값을 반환하는 것하지 않는 것이. name 메소드를 호출의 결과가 아닌 허위, 비어 있지 않은 값을 반환해야 할 것입니다

its(:name){ should be_present } 

: 당신이 반환되는 값이 있다고 테스트하려는 경우, 당신은 뭔가를 할 수 있습니다. 그런 다음 해당 테스트를 취소 할 때

its(:name){ should_not be_present } 

name 메소드가 공백으로 반환한다고 단정합니다. 다른 상태의 객체를 테스트하기 때문에 두 번째 테스트의 다른 설정을 만들어야합니다.

+0

Thanks @Emily ... 물론 respond_to에 대한 잘못된 이해가있었습니다. 귀하의지도 충만 함을 얻으려면 더 많은 독서와 실험을해야합니다. 유효성 검사 : 존재 여부에 따라 값이 있는지 여부와 관련하여 바를 충족합니까? – thomasvermaak

+1

Rspec의 가장 큰 장점은 바로 이런 종류의 물건을 직접 테스트하는 것입니다. Rspec에서'be_present'를 호출하면 모델에서'present? '를 호출합니다. 'respond_to? '를 호출하는 것과 같습니다. 그런 다음 IRB에서 이러한 메서드를 쉽게 테스트 할 수 있습니다. 'present?'는''''''''''''''''''''''''''''''''''을 제외한 모든 것에 대해서''true '를 반환합니다. – Emily

0

개별 테스트를 더 같이해야한다 : 당신이 클래스를 테스트하는 경우

it "should have an email attribute" do 
    @attr.should respond_to(:email) } 
end 

그러나, 나는 당신의 시험이의 라인을 따라 더 뭔가를 제안 할 수 있습니다

you'v 일단

it "should create a new instance given valid attributes" do 
    Employee.create!(@attr) 
end 

:

before (:each) do 
    @attr = {name: "One", email: "[email protected]"} 
end 

그런 다음 첫 번째 테스트는 창조과 같이 작동 보장 ,

describe "Attributes and method tests" do 
    before (:each) do 
    @employee = Employee.create(@attr) 
    end 

    it "should have a name attribute" do 
    @employee.should respond_to(:name) 
    end 

    it "should have an email attribute" do 
    @employee.should respond_to(:email) } 
    end 

    # etc... (to test other attributes or methods) 
end 

테스트를 반전하고 속성이 비어있는 경우가 유효 아니라고 지정에 대한 귀하의 질문에 대답하려면 : 전자는 당신을 일하고, 다른 테스트를 계속 자동과 같이 생성 얻을 직원을 가질 수 설립 나는 이와 같은 것을 시도 할 것이다.

it "should not be valid with a blank email" do 
    Employee.new(@attr.merge(:email => '').should_not be_valid 
end 

it "should not be valid with a blank name" do 
    Employee.new(@attr.merge(:name => '').should_not be_valid 
end 
+0

이것은 주관적이며 전혀 대답하지 않습니다. –

+0

죄송합니다. 처음에는 질문을 잘못 읽었습니다. 테스트 작성을위한 올바른 형식을 이해하는 데 어려움을 겪고 있다고 말한 것입니다. 내 대답을 업데이트했습니다. – Batkins

+0

글쎄 그것은 * 내 * 질문 아니지만 원래 물건을 떠난 여전히 주관적인 허풍, IMO 오해의 소지가있다. –