【发布时间】:2012-07-26 17:59:54
【问题描述】:
我有一个 OCUnit 测试类:PatientTestViewControllerTests。下面是界面:
@interface PatientTestViewControllerTests : SenTestCase
@property (nonatomic, strong) PatientTestViewController *testController;
@end
和设置:
- (void) setUp
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Testing" bundle:nil];
self.testController = [storyboard instantiateInitialViewController];
}
“测试”故事板是我的应用程序中唯一的故事板,并被设置为应用程序的主故事板。 PatientTestViewController 被设置为情节提要的唯一视图控制器。
我的测试班有一个测试:
- (void) testInitialTestingStoryboardViewIsPatientTest
{
STAssertTrue([self.testController isMemberOfClass:[PatientTestViewController class]], @"Instead of the %@, we have %@",[PatientTestViewController class], [self.testController class]);
}
此测试失败并显示以下日志消息:
错误:-[PatientTestViewControllerTests testInitialTestingStoryboardViewIsPatientTest]:“[self.testController isMemberOfClass:[PatientTestViewController class]]”应该为真。我们使用 PatientTestViewController
代替 PatientTestViewController这怎么可能?自从
[self.testController isMemberOfClass:[PatientTestViewController class]]
显然是假的,测试日志怎么能说两者都是
[self.testController class] 和 [PatientTestViewController class]
看起来一样吗?
附加信息:
- 在测试中使用
[self.testController isKindOfClass:[PatientTestViewController class]]也会失败 使用
[self.testController class] == [PatientTestViewController class]也会失败。使用
[self.testController isKindOfClass:[UIViewController class]]PASSES。- 使用
[self.testController isMemberOfClass:[UIViewController class]]失败。
【问题讨论】:
-
出于好奇,
NSLog(@"Expected address: %p, actual: %p",[PatientTestViewController class], [self.testController class]);长什么样子? -
@JoshCaswell 啊哈。有趣的问题!和一个有趣的答案。 “预期地址:0x679fa48,实际:0x59bc” 那么……这是什么意思?显然它们是不同的内存地址......但是 isMemberOfClass 测试的对象是什么?是严格的对象相等吗,比如'=='?
-
@JoshCaswell 有趣的是,如果我使用标准的 alloc/init 在 setUp 中实例化 testController 对象,则测试通过没有问题,并且两个地址相同。那么为什么
[UIStoryboard instantiateInitialViewController]会返回不同的东西......它有什么不同呢? -
我不确定
isMemberOfClass:如何在内部检查相等性。我有点怀疑 UIStoryboard 出于某种原因创建了一个虚拟替代类。可能是某种懒惰。怎么样:如果你给testController发消息,然后做isMemberOfClass:,isKindOfClass:,然后打印地址会怎样? -
我想你可能会在这里做点什么。向
testController发送消息并没有改变任何东西(地址仍然存在相同的差异)。但是,我创建了一个新项目来复制问题,但我无法复制它。这两个项目之间唯一真正的区别是我在摆弄我原来的故事板。我一定做了……什么。
标签: objective-c ios unit-testing ocunit