我知道OCMock 2.1+版本支持开箱即用的类方法。但是由于某种原因,它无法与我一起使用。为了确保隔离问题,我简单地克隆了示例OCMock项目(该项目明显标记为2.2.1版),并将其添加到testMasterViewControllerDeletesItemsFromTableView内部:
id detailViewMock = [OCMockObject mockForClass:[DetailViewController class]];
[[[detailViewMock stub] andReturn:@"hello"] helloWorld];
在DetailViewController.h
我补充说:
+ (NSString *)helloWorld;
和DetailViewController.m
:
+ (NSString *)helloWorld {
return @"hello world";
}
但是我继续得到错误:
*** -[NSProxy doesNotRecognize Selector:helloWorld] called!
要查看问题的演示,请克隆此存储库以查看发生了什么。
那应该很好。我刚在一个我的项目中尝试过,该项目在Xcode5上使用XCTest,并且该代码已通过。
我会1)确保您使用的是最新版本的OCMock(目前为2.2.1;我认为较新版本中的类方法和Xcode5都有一些修复),以及2)确保您的DetailViewController类是在运行时(即正确目标的一部分)正确链接。
在查看项目时,DetailViewController类是主应用程序和测试目标的一部分。对于Xcode5,这似乎意味着该类的两个副本已编译并存在于运行时中,应用程序中的代码调用一个副本,而测试用例中的代码调用另一个副本。这曾经是一个链接器错误(重复的符号),但是无论好坏,链接器现在似乎默默地允许ObjC运行时中存在两个相同类(具有相同名称)的副本。OCMock使用动态查找来找到第一个(编译到应用程序中的一个),但是测试用例直接链接到第二个副本(编译到测试包中的一个)。所以... OCMock实际上并没有嘲笑您认为是的类。
您可以通过在测试用例中验证[DetailViewController类]不等于NSClassFromString(@“ DetailViewController”)(第一个是直接链接的,第二个是动态的)作为测试用例的一部分而看到的。
要正确解决此问题,请在DetailViewController.m的“目标成员身份”中,取消选中测试目标。这样,在运行时中只有一个类的副本,并且事情按您期望的那样工作。测试捆绑软件被加载到主应用程序中,因此所有主应用程序的类都应可用于捆绑软件,而不必直接将它们编译到捆绑软件中。类只能是两个目标之一的一部分,而不是两个目标(一直都是这种情况)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句