使用 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 返回(空)的主要内容,如果未能解决你的问题,请参考以下文章

你还应该在单元测试中进行内存管理吗? (OCUnit)

在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试

单元测试和 TDD、OCUnit 与 Google 工具箱

如何在单元测试(OCUnit)中访问 NSDocumentDirectory

OCUnit/XCode 单元测试的优秀测试运行器

iPhone 上的 ocunit 测试