2015-02-02 4 views
2

가정하자 나는 아주 간단 레이크 작업이 있습니다테스트하는 방법 시스템은 레이크 작업에서 호출

task :test do 
    system "bundle exec rspec spec" 
end 

나는 ::Kernel.system 메소드 호출 스텁하여 테스트를 시도 :

describe "test" do 

    before { allow(::Kernel).to receive(:system) } 

    it "runs 'bundle exec rspec spec'" do 
    expect(::Kernel).to receive(:system).with "bundle exec rspec spec" 
    Rake::Task[:test].invoke 
    end 
end 

을하지만 방법은 같다 완전히 스터브되지 않아야한다. 대신, 테스트 스위트를 호출하는 반복의 무한 사이클을 실행합니다.

무엇이 문제이며, howto stub 시스템 호출이 제대로 되었습니까?

답변

4

Kernel은 모든 루비 Object에 포함되는 모듈입니다. Kernel#system은 인스턴스 메소드 (클래스 메소드가 아님)입니다.

하나 개의 솔루션 (discouraged by rspec maintainers 비록) "인스턴스"를 사용하는 것입니다

it "runs 'bundle exec rspec spec'" do 
    expect_any_instance_of(Kernel).to receive(:system).with "bundle exec rspec spec" 
    Rake::Task[:test].invoke 
end 

expect 또는 allow, 당신은 메시지를 수신하는 실제 인스턴스 객체의가 필요합니다 정기적으로 사용하기 위해서는 . 레이크 작업의 경우 이것은 성가신 일이지만 (불가능하지는 않지만 - this question 참조) 최상위 컨텍스트에서 실행됩니다.

system 호출을 유틸리티 클래스 메서드로 캡슐화하고 expect 호출을 제안 할 것입니다. 테스트가 더 쉬울 것이고 명시적인 클래스 & 인스턴스를 사용할 수 있습니다.

+0

감사합니다, Łukasz, 당신은 내 하루를 구했습니다! 새로운 RSpec 구문을 사용하여 'any_instance'의 이전 구문을 완전히 잊어 버렸습니다. 명확성을 위해이 문제를 해결하는 것은'allow_any_instance'라고 말하고 싶습니다. –