2009-10-28 5 views
3

여러 가지 점에서 백틱을 사용하는 Ruby 코드를 테스트 해보고 싶습니다. 나는 FlexMock을 사용하고 있으며 그 방법을 모의하고 싶습니다. 나는 방법이 Kernel, :` 인 것을 안 단다.하지만 FlexMock에서 작동하는 것처럼 보이지는 않는다. 어떻게 할거 니? 여기에 테스트 할 방법의 샘플입니다 :Ruby - FlexMock Backticks Method

def foo 
    result = `ls` 
    if result.to_a.length > 0 
    true 
    else 
    false 
    end 
end 

답변

3

Backticks 메서드가 Kernel으로 매핑됩니다 .`는 FlexMock 소스를보고 유효한 메서드 이름으로 간주 할 때까지 유효합니다. 근본적으로 그들이 사용하는 정규식은 영숫자를 확인하고 있습니까? 또는! 결국, 백틱은이 정규식과 일치하지 않습니다.

내부적으로 코드를 변경하면 throw되는 초기 예외가 해결되지만 실제로 의도 한대로 코드가 작동하지는 않습니다. 피어르가 제안한대로 필자는 그것을 monkeypatched 할 수 있었지만, 그것은 테스트 코드에서 극도로 반복적이었을 것입니다. 그래서 나는 대체 경로를 갔고 backticks 만하는 라이브러리 코드에서 쉘 메소드를 만들었습니다. 이 방법은 원하는 방식으로 조롱 될 수 있으며, 소수의 장소에서만 백틱을 사용하기 때문에 내 기본 코드가 많이 변경되지 않았습니다.

1

내가 flexmock에 대해 아무것도 몰라,하지만 당신은 this보고 할 수 있습니다.

+0

흠을 사용하지만 주위를 얻을 수 있도록 설계되었습니다 flexmock 많은 일을한다. 문제의 일부는'메소드가 표준 메소드와 다르게 명명 되었기 때문에 flexmock의 내부 정규식은 실제 메소드라고 생각하지 않지만 좋은 아이디어는 +1합니다. 감사! –

0

대신 코드에

`cmd` 

를 사용하는

Kernel.` "cmd" 

를 호출해야합니다. 그럼 당신은 다음과 같이 테스트 할 수 있습니다

it "should call system ls" do 
    Kernel.should_receive(:`).with("ls") 
    Kernel.` "ls" 
end 

이 예, 나는이 비슷한을 사용할 수있는 순수 RSpec에에게

+1

그래, 내 대답은 말했지만, flexmock은 조롱 된 메소드 이름에 백틱을 허용하지 않으므로 rspec에서 작동 할 수도 있지만 flexmock에서는 작동하지 않습니다. 그래도 고마워! –