【问题标题】: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 没有提供任何信息。

标签: ios objective-c unit-testing xctest


【解决方案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 可能没有构建它的头文件搜索路径为新班级。特别是如果您为新文件添加新目录。在这种情况下,只需清理项目即可解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多