使用 OCUnit 进行单元测试时的 NSBundle 返回(空)
Posted
技术标签:
【中文标题】使用 OCUnit 进行单元测试时的 NSBundle 返回(空)【英文标题】:NSBundle while unit testing with OCUnit returns (null) 【发布时间】:2013-03-18 07:10:11 【问题描述】:问题:在运行单元测试时从 NSBundle 检索返回 (null)
,在运行时返回有效对象。
我做了什么?
我已经搜索过类似问题的 SO、apple's developer 和其他在线资源,但没有运气。
我已经尝试过 SO 问题的解决方案; OCUnit & NSBundle, NSBundle pathForResource returns nil.
我在网上看到的所有解决方案都指向一件事运行时捆绑和测试不同。
他们都推荐有
[NSBundle bundleForClass: [self class]];
而不是
[NSBundle mainBundle];
问题:我不明白上述修复是使用 setter 注入还是源文件本身。 ?有没有其他方法可以测试方法getIpAdress
?
代码
返回的类(null),
// iRNetworkingObject.m
@implementation iRNetworkingObject
-(NSString*) getIpAdress
NSDictionary *infoDict = [[NSBundle bundleForClass:[self class]] infoDictionary];
NSString *lookUpAdress = [infoDict objectForKey:@"LookUpIpAdress"];
return lookUpAdress;
@end
测试类
- (void) testGetIpAdress
iRNetworkingObject* networkingObject = [[iRNetworkingObject alloc] init];
NSString* testCase = @"192.168.2.1";
NSString* encondedString = [networkingObject getIpAdress]];
STAssertTrue([testCase isEqualToString:encondedString], @"Not equal");
【问题讨论】:
【参考方案1】:bundleForClass:
在测试代码中很重要,以确保您获得的是应用程序包而不是测试包。您不必在生产代码中这样做。
您的密钥@"LookUpIpAdress"
拼写错误。是这个问题吗?
【讨论】:
好的,所以生产代码可以有mainBundle
,我必须使用测试代码中的setter injection
之类的东西才能通过捆绑包?不,拼写很好,它适用于运行时,我在问题中简化了我的代码;)
不需要setter注入。测试应该能够验证实际值。
这是问题所在,不是。 :(
我复制了你的代码。工作正常。如果我使用STAssertEqualObjects([networkingObject getIpAdress], @"192.168.2.1", nil)
,任何失败都更具描述性。
是的,这告诉我(null) should be equal to 102.168.2.1
。还有什么我可能会错过的吗?以上是关于使用 OCUnit 进行单元测试时的 NSBundle 返回(空)的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试