2013-03-18 58 views
0

问题:运行单元测试时返回(null),在运行时返回有效的对象。使用OCUnit进行单元测试时的NSBundle返回(null)

我做了什么?

我已经搜索过与类似问题,苹果的开发人员和其他在线资源,但这个问题没有运气。

我已经尝试过SO问题的解决方案; OCUnit & NSBundleNSBundle pathForResource returns nil

我通过网上的所有解决方案都指出了一件事运行时间和测试包是不同的。

所有这些建议具有

[NSBundle bundleForClass: [self class]]; 

代替

[NSBundle mainBundle];  

问:如果上面的解决方法是使用setter注入或源文件本身,我不明白。 ?有没有其他方法可以测试方法getIpAdress

代码

类返回(空),

// 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"); 
} 

回答

2

bundleForClass:是在测试代码很重要,以确保你得到的应用程序包,而不是的测试包。您不应该在生产代码中这样做。

您的密钥@"LookUpIpAdress"拼写错误。这是问题吗?

+0

好的,所以生产代码可以有'mainBundle',我将不得不从测试代码中使用类似'setter injection'的东西来传递包? Naa,拼写很好,它在运行时间工作,我简化了我的代码在这个问题;) – 2013-03-19 04:17:17

+0

不需要setter注入。测试应该能够验证实际值。 – 2013-03-19 05:27:24

+0

这是问题,它不是。 ( – 2013-03-19 05:28:17