我正在尝试将rspec与MacRuby一起使用来测试用Objective-C编写的框架。
然而,似乎不可能使用这种方法来存储某些选择器。例如:
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'
此外,似乎无法存根接受多个参数并提供实现的选择器,例如尝试在setObject:forKey:
上存根NSMutableDictionary
,如下所示:
NSMutableDictionary.any_instance.stub(:setObject) do |*args|
puts *args
end
什么都不做。
我尝试了MacRuby和rspec版本的各种组合(MacRuby 0.10,0.11和rspec 2.5和2.8),行为似乎是一样的。我也试过指定选择器名称的变体,例如“:setObject:forKey”等没有运气。
这是一个bug还是仅仅是对rspec和macruby的限制?有办法解决它吗?
答案 0 :(得分:1)
对于具有多个参数的objective-c方法的选择器,请使用字符串,而不是符号,其中包含方法名称的命名参数部分与参数之间的“:”分隔符。 E.g。
class C
attr_accessor :my_prop
end
o = C.new
o.send('setValue:forKey:', 'hohoho', :my_prop) # => #<C:0x4013fd2e0 @my_prop="hohoho">