是否可以使用MacRuby和rspec存根本机方法?

时间:2012-03-03 20:14:11

标签: rspec macruby

我正在尝试将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的限制?有办法解决它吗?

1 个答案:

答案 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">