gpt4 book ai didi

objective-c - 如何验证部分模拟是否具有使用ocmock的args调用的基本方法?

转载 作者:行者123 更新时间:2023-12-01 19:22:09 30 4
gpt4 key购买 nike

我正在使用一个非常简单的Web服务,该服务使用基类重用一些常用功能。被测试的主要方法只是构建一个url,然后使用带有此参数的super / base方法。

- (void)getPlacesForLocation:(Location *)location WithKeyword:(NSString *)keyword
{
NSString *gps = [NSString stringWithFormat:@"?location=%@,%@", location.lat, location.lng];
NSURL *url = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"%@%@", self.baseurl, gps]];
[super makeGetRequestWithURL:url];
}

这是基本方法定义
@implementation WebService
@synthesize responseData = _responseData;

- (id)init
{
if (self == [super init])
{
self.responseData = [NSMutableData new];
}

return self;
}

- (void)makeGetRequestWithURL:(NSURL *)url
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
request.HTTPMethod = @"GET";

[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

在我的测试中,我创建了部分模拟,因为我仍然想调用被测对象,但是我需要能够验证是否以特定方式调用了super方法。
- (void)testGetRequestMadeWithUrl
{
self.sut = [[SomeWebService alloc] init];
Location *location = [[Location alloc] initWithLatitude:@"-33.8670522" AndLongitude:@"151.1957362"];
NSURL *url = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"%@%@", self.sut.baseurl, @"?location=-33.8670522,151.1957362"]];
id mockWebService = [OCMockObject partialMockForObject: self.sut];
[[mockWebService expect] makeGetRequestWithURL:url];
[self.sut getPlacesForLocation:location WithKeyword:@"foo"];
[mockWebService verify];
}

但是,当我运行此测试时,失败并出现以下错误:

没有调用预期的方法:makeGetRequestWithURL:https:// ...

我可以说此方法不是模拟的,因为如果我将NSLog放入基本方法中,则在运行ocunit测试时它会显示出来(显然它正在运行,只是没有像我想的那样模拟它)。

如何修改测试/重构实现代码以获取所需的断言?

最佳答案

这是一个有趣的案例。我的假设是,如果将“super”替换为“self”,那么一切都会按预期进行,即。

- (void)getPlacesForLocation:(Location *)location WithKeyword:(NSString *)keyword
{
NSString *gps = [NSString stringWithFormat:@"?location=%@,%@", location.lat, location.lng];
NSURL *url = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"%@%@", self.baseurl, gps]];
[self makeGetRequestWithURL:url];
}

问题在于,部分模拟是通过动态创建子类来实现的。使用“super”时,对方法的查找从父类(在您的情况下为基类)开始,这意味着运行时永远不会看到由部分模拟创建的子类中实现的方法。

您问题的另一个答案是更改设计。而不是使用类层次结构,而是使用两个类。一类负责创建URL,另一类负责发出请求。然后,您将不需要部分模拟,因为您可以简单地替换请求生成器。参见单一责任原则[1]和继承之上的组成[2]。

[1] http://en.wikipedia.org/wiki/Single_responsibility_principle

[2] http://en.wikipedia.org/wiki/Composition_over_inheritance

关于objective-c - 如何验证部分模拟是否具有使用ocmock的args调用的基本方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9785949/

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