我正在使用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));发布于 2013-01-19 07:13:50
首先,请注意,当您没有为OCMockito指定匹配器时,它将使用isEqual匹配器。这可能不是您想要为第二个参数验证的内容。我会检查自己的身份:
fromSearchManager:sameInstance(_sm)如果输入了参数,它会抱怨匹配器sameInstance不是搜索管理器。解决方法是强制转换匹配器以删除键入:
fromSearchManager:(id)sameInstance(_sm)现在来看第一个参数:您可能根本不需要创建自定义匹配器。如果您只想检查属性值,请使用hasProperty。假设属性名为accessory,
zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))把所有这些放在一起:
[verify(mockController)
zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))
fromSearchManager:(id)sameInstance(_sm)];https://stackoverflow.com/questions/14392316
复制相似问题