2012-03-03 34 views
0

我想用rspec和MacRuby一起测试一个用Objective-C编写的框架。是否有可能使用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' 

而且它似乎并不可能存根一种选择器,需要多个参数,并提供一个实现,例如尝试在NSMutableDictionary存根setObject: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 2012-03-08 13:37:03

+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 2012-03-08 14:08:35

+0

刚刚遇到一个MacRuby规范,显示objc风格参数的语法实际上应该是一个带有引号的符号,包括所有冒号。所以试试::'setValue:forObject:'作为stub()的参数。 – sohocoke 2012-05-02 20:16:05

相关问题