isKindOfClass和NSStringFromClass不同意UIApplicationDelegate

poh*_*ohl 14 iphone objective-c ocunit cs193p uiapplicationdelegate

我正在玩一个简单的OCUnit测试用于iPhone应用程序,并且只是想断言应用程序委托是我期望它的类的实例.我没想到这个测试非常有用,但结果却揭示了我对Objective 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");
}
Run Code Online (Sandbox Code Playgroud)

什么情况可能导致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).
Run Code Online (Sandbox Code Playgroud)

Fel*_*lix 12

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

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