gpt4 book ai didi

ios - stub [[SomeClazz alloc] init] 不工作但接受的答案说它应该工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:59:56 26 4
gpt4 key购买 nike

我测试的功能很简单:

@implementation MyHandler
...
-(void) processData {
DataService *service = [[DataService alloc] init];
NSDictionary *data = [service getData];
[self handleData:data];
}

@end

我使用 OCMock 3对其进行单元测试。

我需要 stub [[DataService alloc] init] 以返回一个模拟实例,我尝试了answer from this question (这是一个公认的答案) stub [[SomeClazz alloc] init]:

// Stub 'alloc init' to return mocked DataService instance,
// exactly the same way as the accepted answer told
id DataServiceMock = OCMClassMock([DataService class]);
OCMStub([DataServiceMock alloc]).andReturn(DataServiceMock);
OCMStub([DataServiceMock init]).andReturn(DataServiceMock);

// run function under test
[MyHandlerPartialMock processData];

// verify [service getData] is invoked
OCMVerify([dataServiceMock getData]);

我已经在被测函数中设置了断点,我确定在运行单元测试时调用了 [service getData],但是我上面的测试代码 (OCMVerify) 失败了。为什么?

是不是因为被测函数没有使用我的mocked DataService?但是该问题中接受的答案告诉它应该有效。我现在很困惑......

我想知道如何 stub [[SomeClazz alloc] init] 以使用 OCMock 返回模拟实例?

最佳答案

你不能模拟 init 因为它是由模拟对象本身实现的。模拟 init 在您链接的答案中起作用的原因是因为它是一个自定义初始化方法。如果您不想使用依赖注入(inject),则必须为可以模拟的 DataService 编写自定义 init 方法。

在您的实现中添加自定义 init 方法:

// DataService.m
...
- (id) initForTest
{
self = [super init];
if (self) {
// custom initialization here if necessary, otherwise leave blank
}

return self;
}
...

然后更新 MyHandler 实现来调用这个 initForTest:

@implementation MyHandler
...
-(void) processData {
DataService *service = [[DataService alloc] initForTest];
NSDictionary *data = [service getData];
[self handleData:data];
}

@end

最后将您的测试更新为 stub initForTest:

id DataServiceMock = OCMClassMock([DataService class]);
OCMStub([DataServiceMock alloc]).andReturn(DataServiceMock);
OCMStub([DataServiceMock initForTest]).andReturn(DataServiceMock);

// run function under test
[MyHandlerPartialMock processData];

// verify [service getData] is invoked
OCMVerify([dataServiceMock getData]);

请随意重命名 initForTest只要它不是 init

关于ios - stub [[SomeClazz alloc] init] 不工作但接受的答案说它应该工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654226/

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