2012-09-27 4 views
0

어떻게 foobar() 메소드를 테스트 할 수 있도록 app 인스턴스에 액세스합니까?Sinatra 앱에서 메소드를 테스트하려면 어떻게해야합니까?

class App < Sinatra::Base 
    get '/' do 
    return foobar 
    end 

    def foobar 
    "hello world" 
    end 
end 
+0

왜 sinatra에서 메서드를 원하십니까? 보기를 사용하여 콘텐츠를 반환하십시오. 또는 도처에있는 도우미를 사용하십시오. 그러나 일반적으로 Sinatra에서는 메소드를 테스트하지 않습니다. – three

+0

하지만 get 블록에서 사용하는 복잡한 방법이 있고이를 별도로 테스트하고 싶다면 어떻게해야합니까? – Lilly

+1

외부에 클래스를 만들고 테스트 할 수 있습니다. – three

답변

0

이 늦은 회신입니다,하지만 그것도 할 수있는 유연한 방법을 찾기 위해 노력하고있다.

Sinatra의 소스 코드 (1.4.5)에서 new!으로 앱 인스턴스를 생성하면 앱의 메소드를 직접 테스트 할 수 있습니다. Test :: Unit 및 Shoulda를 사용하여 테스트 설정에서 테스트하십시오.

class AppTest < Test::Unit::TestCase 
    setup do 
    @app = App.new! # here is the point. 
    end 

    should 'say hello to the world' do 
    assert_equal "hello world", @app.foobar # or @app.send(:foobar) for private methods. 
    end 
end 

결과가 있습니다. new!을 사용하면 entry point to the middleware pipeline and the app in normal settings이되는 일반적인 Sinatra::Wrapper을 만들지 않습니다. 따라서 new! 접근법은 테스트 된 메소드가 미들웨어 기능 (예 : SSL)에 의존하지 않는 "도우미"인 경우에만 작동합니다. 또는 post on Rspec은 대안적인 해결책을 제안한다. 과거에는 비슷한 것을 사용 했었지만, 항상 최선의 선택이 아닌 더 많은 작업이 필요합니다. 테스트 할 코드의 범위를 넓히는 것이 장점이었습니다. new!으로 앱을 격리하면 "단위 테스트"를 수행하는 것이 좋습니다.

@ 3 님의 의견에 유의하십시오 : 평범하지 않은 앱은 모든 도우미 등의 API 메소드 (일반적으로 앱에서)를 분리해야합니다. 별도의 파일로 끝나는 도우미는보다 깔끔하고 유지 보수가 쉽고 테스트하기 쉽습니다. 하지만 리팩토링이 필요하다는 인식하에 앱의 첫 번째 버전에 몇 명의 헬퍼가 포함되는 경우를 분명히 이해합니다. 그리고 테스트를 거치더라도 소프트웨어 자체와 향후 리팩토링에 대한 확신이 생깁니다.

관련 문제