导入头文件时单元测试失败
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 可能没有构建它的头文件搜索路径为新班级。特别是如果您为新文件添加新目录。在这种情况下,只需清理项目即可解决问题。
【讨论】:
以上是关于导入头文件时单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章
角度单元测试:失败:模块“DynamicTestModule”导入的意外值“DxTemplateHost”:添加@NgModule 注释
Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“导入桥接头失败”