isKindOfClass和NSStringFromClass不同意UIApplicationDelegate

时间:2011-03-19 18:43:04

标签: iphone objective-c uiapplicationdelegate ocunit cs193p

我正在玩一个针对iPhone应用程序的简单OCUnit测试,并且只是想断言app委托是我期望它的类的实例。我没想到这个测试非常有用,但结果却揭示了我对目标C的误解。

我首先获得对该委托的引用。然后我记录回来的类名。在我的例子中,输出正确地说“app delegate的类名是CalculatorAppDelegate”。

然而,下一行的断言失败了,我不明白为什么。

- (void)testAppDelegate 
{
    id appDelegate = [[UIApplication sharedApplication] delegate];
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}

什么情况可能导致NSStringFromClass()返回正确的类名,而isKindOfClass返回false?

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds).

2 个答案:

答案 0 :(得分:12)

您尚未正确配置测试目标。如果您关注this guide for unit testing applications,则应该有3个目标:计算器 CalculatorTests CalculatorTesting 。 检查 CalculatorTests 中的“构建阶段”部分。在“编译源”中,只应列出 SenTestCase 源文件。我猜你在那里添加了 CalculatorAppDelegate.m 和其他文件 - 这会导致相同源文件的重复程序集,然后在构建 CalculatorTesting 目标。这就解释了为什么你的断言失败了。

编辑:刚刚意识到您不需要Xcode 4中的 CalculatorTesting 目标。只需转到Project>编辑方案...并确保单元测试包列在测试部分中。然后,您可以使用Cmd-U运行单元测试。

答案 1 :(得分:1)

尝试注销操作的返回值

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);

你甚至可以测试它是否是一个成员:

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);

不确定它是否会有所帮助,但它是一个起点