Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Can';t在基本单元测试设置中测试我的类_Iphone_Objective C_Ios_Xcode_Unit Testing - Fatal编程技术网

Iphone Can';t在基本单元测试设置中测试我的类

Iphone Can';t在基本单元测试设置中测试我的类,iphone,objective-c,ios,xcode,unit-testing,Iphone,Objective C,Ios,Xcode,Unit Testing,我已经成功地将一个普通的单元测试包添加到我的项目中。我可以构建和运行我的测试目标,一个样本测试可以很好地工作 当我试着测试一个特定的类时,事情开始走下坡路 在我的应用程序中,我的许多.h文件都包含在.pch文件中。此外,MyModel还与其他类交互。正因为如此,当我导入MyModel.h并在测试中使用它时,我得到了一系列与无法加载其他文件相关的错误。我的解决方法是简单地将相同的文件添加到测试目标的.pch文件中,并将这些文件添加到测试目标的“编译源代码”列表中 因此,我将这些类添加到测试目标和.

我已经成功地将一个普通的单元测试包添加到我的项目中。我可以构建和运行我的测试目标,一个样本测试可以很好地工作

当我试着测试一个特定的类时,事情开始走下坡路

在我的应用程序中,我的许多.h文件都包含在.pch文件中。此外,MyModel还与其他类交互。正因为如此,当我导入MyModel.h并在测试中使用它时,我得到了一系列与无法加载其他文件相关的错误。我的解决方法是简单地将相同的文件添加到测试目标的.pch文件中,并将这些文件添加到测试目标的“编译源代码”列表中

因此,我将这些类添加到测试目标和.pch中,尝试运行,最终我陷入了一个无休止的循环,总是需要更多的文件。当我最终将every.m添加到我的项目中时,运行测试仍然失败得惊人

你知道我需要如何正确地设置我的项目,以便只需
#将“MyModel.h”
导入到我的测试文件中并编写/运行我的测试吗?我的项目是否有可能以一种不可能进行测试的方式进行配置

更新1 按照卡尔的建议,但无法通过第二步。我得到:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_MyModel", referenced from:
      objc-class-ref in BaseUnitTests.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

在这一点上,我会将MyModel.m添加到“构建阶段/编译源代码”中,然后沿着无休止的路径,将每个其他.m文件添加到测试目标的“编译源代码”中。

代码的编写方式肯定会使测试变得困难,尤其是在编写代码时没有考虑测试。但这并非不可能。现在你只需要清理你的进口。我想我会采取的方法是

1) 从测试目标中删除所有非测试用例类实现(.m)——它们不需要存在。通过将它们从测试目标的构建阶段的“编译源代码”窗格中删除来实现这一点

2) 将所有PCH导入复制到测试用例中(临时)。导入
“MyModel.h”
。尝试只获取
MyModel
的一个实例,并测试它不是
nil
并且具有正确的类。如果需要,只需继续添加导入,但不要添加.m

3) 这一步和下一步是可选的,但我强烈推荐它们,因为它们可能会暴露代码中的问题区域,从而阻止您编写细粒度测试。一旦您通过了简单的测试,就应该开始清理您的导入了。切换回主项目。首先,我将开始从pch中删除您自己的任何类(不包括库/框架类型导入)。每次从pch中删除一个标题,并将它们导入真正需要它们的文件中

3a)在执行此过程时,请确保从其他头文件导入的文件尽可能少。在少数情况下,您的.h中应该只有一个#import,通常是:1)对导入文件中声明的类进行子类化2)实现导入文件中声明的协议3)引用导入文件中定义的任何C类型。对于协议和类,在头中使用@protocol和@class转发声明它们,并且仅在您实际发送消息或访问它们的属性(通常在.m中)的位置导入它们


因此,在这一点上,您应该有一个通过的单元测试和一个更干净的pch。请确保现在在单元测试中清理导入。切换回您的测试目标,并开始编写更多测试。当您使界面更加集中和可测试时,导入文件的需求将减少。希望这有帮助

我也遇到了同样的问题,只需将xxx-Prefix.pch文件路径添加到我的测试目标的GCC_Prefix_头中,就像我对主应用目标所做的那样:


当你说它“失败得惊人”时,发生了什么?我想这可能是含糊不清的。只是问题导航器中大量的错误。有时只是找不到另一个类中引用的类,有时是其他模糊的错误消息,没有多大意义。不幸的是,我没有一个具体的例子可以分享。卡尔,这是很好的信息。不幸的是,我无法通过第二步。我用更多的细节更新了我的问题。@djibouti33哦,你知道吗?很抱歉,我把这些作为应用程序测试目标,我想你想要一个逻辑目标?一个新项目的默认设置是应用程序测试,所以我选择了应用程序测试,但是仔细看一下你的教程和我自己项目中的构建设置,我发现这是不正确的。如果您正在进行逻辑测试,那么我认为您要么必须将所有内容添加到目标,直到链接器停止故障,要么重构,直到
MyModel
不与这么多其他类耦合。不过,我认为您可以使用应用程序测试来帮助您进行重构。谢谢Carl。我的最终目标是能够使用Kiwi进行测试,根据他们的说明()似乎他们为您设置了一个应用程序测试。我对这个区别有点困惑,但如果我只是想测试一个模型类,它看起来像是一个逻辑测试,但Kiwi似乎是用于应用程序测试。我不能对Kiwi发表评论,但总有一天我会尝试一下。我同意一个简单的模型测试听起来像是一个逻辑测试,但如果它与应用程序的其余部分紧密耦合,那么你可能需要在应用程序测试中进行测试,直到你可以重构它,使它更独立。