首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于OCMockito模拟验证的自定义OCHamcrest匹配器

用于OCMockito模拟验证的自定义OCHamcrest匹配器
EN

Stack Overflow用户
提问于 2013-01-18 12:18:41
回答 1查看 598关注 0票数 1

我正在使用OCHamcrest和OCMockito对一个iOS项目进行单元测试。我正在努力理解如何在模拟验证中使用自定义匹配器来验证带参数的方法期望。特别是,我想验证传递给预期方法的一个参数,但我需要拆分传递的参数才能做到这一点。为了演示,下面是我的测试方法的相关部分:

代码语言:javascript
复制
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博客文章),可能在其他地方也有用:

代码语言:javascript
复制
#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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-19 07:13:50

首先,请注意,当您没有为OCMockito指定匹配器时,它将使用isEqual匹配器。这可能不是您想要为第二个参数验证的内容。我会检查自己的身份:

代码语言:javascript
复制
fromSearchManager:sameInstance(_sm)

如果输入了参数,它会抱怨匹配器sameInstance不是搜索管理器。解决方法是强制转换匹配器以删除键入:

代码语言:javascript
复制
fromSearchManager:(id)sameInstance(_sm)

现在来看第一个参数:您可能根本不需要创建自定义匹配器。如果您只想检查属性值,请使用hasProperty。假设属性名为accessory

代码语言:javascript
复制
zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))

把所有这些放在一起:

代码语言:javascript
复制
[verify(mockController) 
        zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory)) 
     fromSearchManager:(id)sameInstance(_sm)];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14392316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档