Можно ли заглушить нативные методы, используя MacRuby и rspec? - PullRequest
0 голосов
/ 04 марта 2012

Я пытаюсь использовать 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 и т. Д.

Это ошибка или просто ограничение rspec и macruby? Есть ли способ обойти это?

1 Ответ

1 голос
/ 08 марта 2012

Для селектора методаjective-c с несколькими аргументами используйте строку, а не символ, который включает разделители ':' между именованными частями аргумента имени метода и аргументами. Э.Г.

class C
  attr_accessor :my_prop
end

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