4

我有一个 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]]通行证。

  • 使用[self.testController isMemberOfClass:[UIViewController class]]失败。
4

2 回答 2

9

问题很可能是您的视图控制器的 .m 文件包含在两个目标中,即应用程序和测试包中。ocunit(以及 Kiwi 等衍生产品)使用测试工具,使应用程序中包含的类可用于测试,而无需显式包含它们的实现。

包括两者都为您提供了同一类的两个副本,这就是为什么它们具有相同的描述但内存地址不同的原因。

于 2012-07-26T20:06:44.490 回答
3

你一般想isKindOfClass:不想isMemberOfClass:。不同之处在于,如果接收者是相关类的子类的成员,则将返回isKindOfClass:,而在相同情况下将返回。YESisMemberOfClass:NO

您也可以使用[self.testController class] == [PatientTestViewController class].

于 2012-07-26T18:24:45.650 回答