2013-03-18 59 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