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的限制?有没有办法解决它?
谢谢,我会尝试,(我想,我想这个变体已经反而会仔细检查) – frankodwyer 2012-03-08 13:37:03
不幸的是这未能在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
刚刚遇到一个MacRuby规范,显示objc风格参数的语法实际上应该是一个带有引号的符号,包括所有冒号。所以试试::'setValue:forObject:'作为stub()的参数。 – sohocoke 2012-05-02 20:16:05