gpt4 book ai didi

ios - 用于 PC Mockito 模拟验证的自定义 Hamcrest 匹配器

转载 作者:行者123 更新时间:2023-11-29 13:20:51 25 4
gpt4 key购买 nike

我正在使用 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));

最佳答案

首先,请注意,当您没有为 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)];

关于ios - 用于 PC Mockito 模拟验证的自定义 Hamcrest 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14392316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com