导入头文件时单元测试失败

Posted

技术标签:

【中文标题】导入头文件时单元测试失败【英文标题】:Unit test failing when importing a header file 【发布时间】:2016-02-15 12:59:28 【问题描述】:

我正在尝试在我的项目中使用 Objective-C 实现单元测试。 问题是构建失败时我没有任何错误消息,经过几次测试,我无法弄清楚如何执行构建。

- (void)setUp 
    [super setUp];

    self.order = [[TLSOrderEntity alloc] init];

    self.calculateVatDictionary = [[NSDictionary alloc] init];

    self.price100 = [NSNumber numberWithInteger:100];
    self.price200 = [NSNumber numberWithInteger:200];

    self.tax5 = [NSNumber numberWithFloat:5.5];
    self.tax10 = [NSNumber numberWithInteger:10];
    self.tax20 = [NSNumber numberWithInteger:20];

此方法很好,可以构建,并且工作正常。当我尝试导入另一个标头并尝试分配相应的对象时,构建立即失败。

#import "TLSOrderLineEntity.h"

- (void)testExample 
    TLSOrderLineEntity *line1 = [TLSOrderLineEntity createEntityLineWithName:@"PRODUIT" price:self.price100 tax:self.tax10 extraLines:nil];

我还有其他接口可以无错误地获取私有方法,并声明一些属性:

#import <XCTest/XCTest.h>
#import <UIKit/UIKit.h>
#import "TLSOrderTaxManager.h"

@interface TLSOrderTaxManager (Test)

+ (NSDictionary *)calculateVatForLines:(TLSOrderEntity *)order;

@end

@interface TLSTaxTests : XCTestCase

@property (nonatomic, strong) TLSOrderEntity    *order;
@property (nonatomic, strong) TLSOrderLineEntity *orderLine;

@property (nonatomic, strong) NSDictionary      *calculateVatDictionary;

@property (nonatomic, strong) NSNumber          *price100;
@property (nonatomic, strong) NSNumber          *price200;

@property (nonatomic, strong) NSNumber          *tax5;
@property (nonatomic, strong) NSNumber          *tax10;
@property (nonatomic, strong) NSNumber          *tax20;

@end

正如我之前所说,我不知道它为什么会失败。 是否存在依赖问题?还是我应该编译相应的 .m 以包含它们?

感谢您的建议!

【问题讨论】:

嗨。请添加您从 xcode 获得的错误消息。 你好。这正是我实际遇到的问题。即使我启用了测试,Xcode 也不会提供任何错误消息。它只是显示“构建失败”。有没有办法显示错误信息? 可以添加截图吗? Build failed-message 没有提供任何信息。 【参考方案1】:

你能提供错误信息吗?尝试点击左侧面板中嵌入三角形的感叹号图标:

尝试按此面板底部的图标(它们负责过滤错误/警告)。也许你以前禁用过错误。

至于您的问题描述,您似乎没有将此文件添加到测试目标。尝试选择 TLSOrderLineEntity.m 并检查此文件的测试目标:

【讨论】:

完美!我没有将文件添加到测试目标,你是对的!它现在似乎工作正常,我也没有启用测试,这就是我没有收到任何消息的原因。谢谢! 没有。生产目标中的文件不应包含在测试目标中。 @JonReid 你为什么这么认为?据我所知,这是一种常见的做法(例如在“测试驱动的 ios 开发”一书中) Graham Lee 说,“遗憾的是,在出版时,链接器问题仍然需要解决。”有关更多信息,请参阅我的书评 qualitycoding.org/test-driven-ios-development-book 并找到“单元测试包应该可以正常链接” @curious 您基本上必须将测试目标与生产目标并行维护。每个文件都包含在两个地方。这带来了所有链接的库。对生产目标的每一次更改都必须在测试目标中重复,这既费时又容易出错。测试时,所有内容都会构建两次,从而减慢您的反馈循环。【参考方案2】:

正确配置的测试目标可以访问生产目标中的所有内容。

在测试目标的“构建设置”中:

为您的应用设置“测试主机”。类似$(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp 将“捆绑加载器”设置为$(TEST_HOST)

在测试目标的“常规”设置中:

指定主机应用程序。确保选中“允许测试主机应用程序 API”复选框。

【讨论】:

【参考方案3】:

如果你刚刚添加了新的生产目标类文件并且你尝试导入它的头文件(即使它的 '.m' 文件被添加到单元测试目标中)它将会失败,因为 XCode 可能没有构建它的头文件搜索路径为新班级。特别是如果您为新文件添加新目录。在这种情况下,只需清理项目即可解决问题。

【讨论】:

以上是关于导入头文件时单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 单元测试断言函数总是失败

角度单元测试:失败:模块“DynamicTestModule”导入的意外值“DxTemplateHost”:添加@NgModule 注释

Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“导入桥接头失败”

TryUpdateModel 仅在更新子对象的单元测试中失败

如何在头文件中使用授权编写路由/端点的单元测试?

Xcode 4:为啥我不能将头文件添加到单元测试目标?