2010-02-11 3 views
1

그래서 같은 XPath를 조건 컨트롤러의 반응을 테스트하는 했어야 매크로/방법이 있어야합니다. 그러나, 나는 하나의 테스트 케이스를 가지고 있는데, 정확히이 하나 존재해야한다. 이는 선택적 블록의 작업입니다. 추가/컨텍스트 관련 어설 션을 수행 할 수 있도록 XPath 일치 항목을 호출자에게 노출합니다.얻기 접근 방법

불행하게도, 실제로 블록 통과 할 때 :

should_have_xpath("//my/xpath/expression") { |match| assert_equal 1, match.size } 

을 ... 나는이 오류가 발생합니다 :

NoMethodError: undefined method `assert_equal' for Users::SessionsControllerTest:Class

이 (내가 그것을 이해) 방식 진작 작동하기 때문에입니다 : "should"호출 (블록 포함)에 전달 된 매개 변수는 테스트 클래스의 인스턴스가 아니라 테스트 클래스의 컨텍스트에서 정의됩니다. Test :: Unit :: Assertions.assert *는 모듈 인스턴스 메서드이므로 편리하게 액세스 할 수 없습니다.

그래서, 내 질문은 : Test/Unit :: Assertions에서 assert * 메서드에 액세스하는 것이 편리하지만/관용적 인 방법이 있습니까? 해결책은 Shoulda에서 반드시 수행해야하지만, Shoulda에 반드시 종속 일 필요는 없습니다. 곧은 Ruby 방식이 좋을 것입니다.

내가 작업 솔루션있어

답변

1

당신이 그것을 원하는대로이 작동합니다 :

def self.should_have_xpath(path, &block) 
    should "have an element matching the path: #{path}" do 
    # ... 
    block.bind(self).call(match) 
    end 
end 
+0

딱! 번들에 감사드립니다. –

0

: 내가하지 특히에있는 같이 내가 바라고 있어요 왜 스택 오버플로가 할 수있는, 테스트 인스턴스마다 시간을 통과 (기억) 할

def self.should_have_xpath(path, &block) 
    should "have an element matching the path: #{path}" do 
    # ... 
    yield match, self 
    end 
end 

should_have_xpath("//my/xpath/expression") { |match, test | test.assert_equal 1, match.size } 

을 더 나은 대답을 내놓을 수 있습니다.