2015-01-23 3 views
4

루비 라이브러리에는 상속을 통해 사용하기위한 몇 가지 클래스가 있습니다. 그러므로 나는 내 spec 파일에서 할 첫번째 일은 정의를 Foo 클래스를 정의한다 :Rspec의 추상 클래스 테스트하기

module MyGem 
    describe MyClass do 
    class FooMyClass < MyClass 
     ... 
    end 
    end 
end 

문제는 정의 된 클래스가 다른 시험을 누출하고 고유 한 이름을 사용하거나 after :all와 클래스를 제거 조심해야한다는 것입니다 블록.

이것은 Rspec에서 이미 제공 한 모든 마법을 고려한 약간의 수동 느낌입니다. 추상 클래스의 스펙을 정의하는 더 좋은 방법이 있습니까? 대부분 모든 임시 선언의 네임 스페이스를 손쉽게 정리할 수있는 방법을 원합니다.

내가 이런 식으로 여러 클래스를 정의 할 때 정리하는 것이 특별히 성가신 :

module MyGem 
    describe MyClass do 
    ... 
    end 

    class FooMyClass < MyClass 
    ... 
    end 
    describe FooMyClass do 
    ... 
    end 
end 

이 제대로 after :all 또는 after :each 블록 해제 정의조차 어렵습니다.

답변

7

가능성은 anonymous classes을 사용하는 것입니다.

let(:fooMyClass) do 
    Class.new(MyClass) do 
     # ... 
    end 
    end 

이렇게하면 정리를 할 필요가 없습니다.

3
describe MyClass do 
    let(:klass) { Class.new(MyClass) } 
    it "works without assigning a constant name" do 
    obj = klass.new 
    expect(obj).to be_kind_of(MyClass) 
    end 
end 

테스트에서 상수 생성은 항상 고통 스러울 것입니다. 이것은 제가 사용 해본 유용한 해결 방법입니다.

0

@ hjing의 대답에서 다음, 하나는 또한 사양에 상수로 사용할 수 MyClass하게 stub_const

before do 
    stub_const('MyClass', fooMyClass) 
end 

를 사용할 수 있습니다. 이것은 클래스의 동작이 이름에 의존하는 경우에 유용합니다 (멋진 메타 프로그래밍에서 가끔 이루어짐).

관련 문제