我正在使用 OCHamcrest 和 OCMockito 对 iOS 项目进行单元测试。我正在努力理解在对采用参数的方法期望的模拟验证中使用自定义匹配器。特别是,我想验证传递给预期方法的参数之一,但我需要拆开传递的参数才能这样做。为了演示,这是我的测试方法相关部分的内容:
EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController =
mockObjectAndProtocol(
[UIViewController class], @protocol(ZKSearchManagerDelegate)
);
[verify(mockController)
zkZSensorFound:isSensorWithAccessory(accessory)
fromSearchManager:_sm];
-zkZSensorFound:fromSearchManager:
接受一个包含 aEAAccessory
作为属性的对象。在我的自定义匹配器中,我需要打开该对象并检查该属性以确保它与accessory
此测试方法中的对象相同。像我在这里所做的那样传递到匹配器很容易accessory
,但是如何获取传递给参数以在匹配器内部使用的实际对象?或者,我对这一切都错了吗?
更新
我已经接受了@JonReid 的答案,因为它比我炮制的解决方案要优雅得多。尽管如此,我认为我正在使用的东西(感谢这篇博文)可能在其他地方有用:
#import "ArgumentCaptor.h"
EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController =
mockObjectAndProtocol(
[UIViewController class], @protocol(ZKSearchManagerDelegate)
);
ArgumentCaptor *captor = argCaptor();
[verify(_mockController) zkZSensorFound:(ZKZSensor *)captor
fromSearchManager:is(sameInstance(_sm))];
ZKZSensor *sensor = captor.argument;
assertThat(sensor.accessory, is(_mockAccessory));