【发布时间】:2013-01-18 04:18:40
【问题描述】:
我正在使用 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: 将包含EAAccessory 的对象作为属性。在我的自定义匹配器中,我需要打开该对象并检查该属性,以确保它与此测试方法中的 accessory 相同。正如我在这里所做的那样,将accessory 传递给匹配器很容易,但是我如何获得传递给参数以在匹配器内部使用的实际对象?或者,我是不是搞错了?
更新
我已经接受了@JonReid 的回答,因为它是一个比我编造的更优雅的解决方案。尽管如此,我认为我正在使用的东西(感谢this 博客文章)可能在其他地方有用:
#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));
【问题讨论】:
标签: ios unit-testing tdd ocmockito ochamcrest