2012-03-03 3 views
0

Objective-C로 작성된 프레임 워크를 테스트하기 위해 MacRuby와 함께 rspec을 사용하려고합니다.MacRuby 및 rspec을 사용하여 원시 메소드를 스텁링 할 수 있습니까?

그러나이 방법을 사용하여 특정 선택기를 스터핑하는 것은 불가능한 것처럼 보입니다. 예를 들어 :에

Foo.stub(:currentSession).and_return(double("session")) 

결과 : 또한

RuntimeError: 
     cannot remove method `obfuscated_by_rspec_mocks__currentSession' because it is a native method 
    # /Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/Gems/1.9.2/gems/rspec-mocks-2.8.0/lib/rspec/mocks/method_double.rb:108:in `block' 

이 같은 여러 개의 인수를 취하는 선택을 스텁 및 NSMutableDictionarysetObject:forKey: 스텁하려고 예를 들어, 구현을 제공하는 것이 가능하지 않는 것 이 :

NSMutableDictionary.any_instance.stub(:setObject) do |*args| 
    puts *args 
end 

아무 것도하지 않습니다.

저는 MacRuby와 rspec 버전 (MacRuby 0.10, 0.11 및 rspec 2.5와 2.8)의 다양한 조합을 시도해 본 결과 동일한 것으로 보입니다. 나는 또한 ": setObject : forKey"와 같은 셀렉터 이름의 변형을 행운과 함께 지정하려고 시도했다.

이것은 버그입니까, 아니면 rspec과 macruby의 제한입니까? 이 문제를 해결할 방법이 있습니까?

답변

1

여러 개의 인수가있는 objective-c 메서드를 선택하는 경우 메서드 이름의 명명 된 인수 부분과 인수 사이에 ':'구분 기호가 포함 된 문자열이 아닌 기호를 사용하십시오. 예 :

class C 
    attr_accessor :my_prop 
end 

o = C.new 
o.send('setValue:forKey:', 'hohoho', :my_prop) # => #<C:0x4013fd2e0 @my_prop="hohoho"> 
+0

감사합니다, 나는 (내가 이미 변형을 시도했다 생각하지만 검사를 두 배로) 당신이 얻을 수 있도록, 그것은 그 이름의 메소드를 정의하려고하기 때문에 – frankodwyer

+0

불행하게도이의 RSpec에 맥락에서 실패를 시도 할 것이다 : 실패/오류 : NSMutableDictionary.any_instance.stub ("setValue : forObject :") do | * args | SyntaxError : /Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/Gems/1.9.2/gems/rspec-mocks-2.8.0/lib/rspec/mocks/any_instance/recorder.rb : 171 : 구문 오류, 예기치 않은 ':', 예상 ';' "\ n" def setValue : forObject : (* args, & blk) – frankodwyer

+0

objc 스타일 인수에 대한 구문을 나타내는 MacRuby 스펙이 실제로는 모든 콜론을 포함하여 따옴표가있는 기호 여야합니다. 그래서 : : 'setValue : forObject :'를 스텁()의 매개 변수로 사용해보십시오. – sohocoke

관련 문제