Dynamic Dispatch Discrepancy
By the way I unsuccessfully tried overriding the methods() method and almost went as far as overriding send on my mock wrapping ObjCMock class. My experience in MOP tells me that overriding send is likely rooted in trouble so I decided against it.
Yesterday’s Ruby drama ended with my finding a hack around the dropped parameters. If I was more familiar with Ruby, had more time to kill, or if it were Groovy instead then my solution would be much cleaner.
Ruby Mocks under RSpec (have no idea if the problem persists in other Ruby scripting environments) do not receive parameters correctly from native Cocoa objects.
Use a home-grown mock to intercept the parameter and pass along to the Ruby mock.
The code: (bowling_controller_spec.rb)
require File.dirname(__FILE__) + ‘/test_helper’
# def method_missing(m, *args)
# puts “Forwarding message”
# @delegate.send(m, args)
@delegate = theMock
describe BowlingController do
@controller = BowlingController.new
@bowling = mock(‘BowlingProtocol’)
@text_field = mock(‘Pins’)
@controller.pins = @text_field
it “should roll a ball” do
it “should roll a ball and get the value from the pins outlet” do
it “should be an OSX::NSObject” do
@controller.is_a?(OSX::NSObject).should == true
it “should have an outlet to a bowling object” do
@controller.bowling = @bowling
it “should send the pin value to the bowling object” do
@controller.bowling = ObjCMock.new(@bowling)
# @controller.bowling = @bowling
I left in the commented out method_missing magic that doesn’t work the way I’d expect it. Ideally I’d like to tuck this wrapping mock to the side without needing to define the specific signature I’m mocking. Ideally method_missing would give me the ability to answer any message. Alas, I get “does not reckognize selector” errors from NSProxy when I enable it. I have a feeling that NSProxy probably looks through the defined methods on it’s delegate and throws this error without 1st trying to invoke the method… effectively killing any dynamic magic ability from objects passed into Cocoa land. I also have a feeling that there are a few other holes in the proxy approach with Ruby/Cocoa. If anybody happens to know the details feel free to chime in.