14

我正在为一个 iPhone 应用程序进行简单的 OCUnit 测试,只是想断言应用程序委托是我期望的类的一个实例。我没想到这个测试会很有用,但结果却揭示了我对 Objective C 的误解。

我首先得到对代表的引用。然后我记录返回的类名。就我而言,输出正确显示“应用程序委托的类名是 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).
4

2 回答 2

12

您没有正确配置测试目标。如果您按照本指南进行单元测试应用程序,您应该有 3 个目标:CalculatorCalculatorTestsCalculatorTesting检查CalculatorTests中的“构建阶段”部分。在“编译源”中,仅应在此处列出SenTestCase源文件。我猜你在那里添加了CalculatorAppDelegate.m和其他文件 - 这会导致相同源文件的重复程序集,然后在你构建CalculatorTesting目标时链接到相同的应用程序。这就解释了为什么你的断言失败了。

EDIT: Just realized that you don't need the CalculatorTesting target in Xcode 4. Just go to Project > Edit Schemes... and make sure the unit test bundle is listed in the Test section. Then you can run unit tests with Cmd-U.

于 2011-03-19T23:21:07.827 回答
1

尝试注销操作的返回值是什么

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

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

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

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

于 2011-03-19T19:42:33.810 回答