Objective c 当从UIStoryboard实例化ViewController时,isMemberOfClass返回no
我有一门眼科测试课:PatientTviewControllerTests。以下是界面:Objective c 当从UIStoryboard实例化ViewController时,isMemberOfClass返回no,objective-c,ios,unit-testing,ocunit,Objective C,Ios,Unit Testing,Ocunit,我有一门眼科测试课:PatientTviewControllerTests。以下是界面: @interface PatientTestViewControllerTests : SenTestCase @property (nonatomic, strong) PatientTestViewController *testController; @end 和设置: - (void) setUp { UIStoryboard *storyboard = [UIStoryboa
@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]);
}
此测试失败,并显示以下日志消息:
错误:-[PatientTestViewController测试开始测试StoryboardViewisPatientTest]:“[self.testController isMemberOfClass:[PatientTestViewController类]]”应为true。我们使用的不是PatientTviewcontroller,而是PatientTviewcontroller
这怎么可能?自
[self.testController是类的成员:[PatientTestViewController类]]
显然是错误的,测试日志怎么能说两者都是错误的呢
[self.testController类]
和[PatientTestViewController类]
看起来一样吗
其他信息:
- 在测试中使用
也会失败[self.testController iskindof类:[PatientTestViewController类]]
- 使用
也会失败[self.testController类]==[PatientTestViewController类]
- 使用
传递[self.testController iskindof类:[UIViewController类]]
- 使用
失败[self.testController isMemberOfClass:[UIViewController] 类]]
是类的类型:
,而不是是类的成员:
。不同之处在于,isKindOfClass:
将返回YES
,如果接收者是相关类的子类的成员,而isMemberOfClass:
将返回NO
您还可以使用
[self.testController class]==[PatientTestViewController class]
直接比较这些类。问题可能是您的视图控制器的.m文件同时包含在应用程序和测试包这两个目标中。ocunit(以及Kiwi等衍生产品)使用了一种测试工具,使应用程序中包含的类可以用于测试,而不必显式地包含它们的实现
包含这两个类会为您提供同一类的两个副本,这就是它们具有相同描述但不同内存地址的原因 谢谢你的回复。我希望测试是具体的,这就是为什么我使用isMemberOfClass。故事板的初始视图应该是PatientTviewController,而不是子类。不过,为了确定,我也尝试过类似的课程。没有骰子。我喜欢“==”测试的想法,但它也不起作用(我将在问题中添加一些其他信息以及我尝试过的内容。出于好奇,
NSLog(@“预期地址:%p,实际地址:%p”,[PatientTviewcontroller类],[self.testController类]);
看起来像什么?@JoshCaswell啊哈。有趣的问题!有趣的答案。“预期地址:0x679fa48,实际地址:0x59bc”那么…这意味着什么?显然它们是不同的内存地址…但是isMemberOfClass测试所针对的是什么?是严格的对象相等吗,比如“==”?@JoshCaswell有趣的是,如果我在设置中使用标准alloc/init实例化testController对象,测试将顺利通过,并且两个地址是相同的。So为什么[UIStoryboard实例化InitialViewController]
返回不同的东西..它有什么不同呢?我不确定isMemberOfClass:
在内部检查是否相等。我怀疑UIStoryboard出于某种原因创建了一个虚拟的替补类。可能是某种懒惰。这是怎么回事:如果您向testController
发送消息,然后执行isMemberOfClass:
,IsKindof Class:
,然后打印地址?我想你可能在这里发现了什么。向测试控制器发送消息
没有改变任何东西(地址仍然存在差异).然而,我创建了一个新项目来复制这个问题,但我无法复制它。这两个项目之间唯一真正的区别是我在摆弄我的原始版本中的故事板。我一定做了……什么。目瞪口呆。就是这样。从测试目标中删除了.m文件,然后责备它。所有事情都通过了。我不习惯o GHUnit,在这里你必须在两个目标中都包含.m文件。谢谢-你刚刚解决了几个小时从类名中创建NSstring的难题!省省时间!!!谢谢你指出这一点。我在我的测试项目中添加了我的模型文件,但它不是必需的。要继续回答这个问题,在你从我是测试目标,你可能需要。