1

我有一个Whiteboard封装我的业务逻辑的框架。我试图保持我的依赖倒置和解耦,因此由于Whiteboard依赖于存储库,它声明了一个协议WhiteboardRepository,并且它希望链接Whiteboard到的客户端提供WhiteboardRepository.

您可以在下面的屏幕截图中看到这一点。还要注意这个WhiteboardTests组,它包括一个WhiteboardRepositoryTests类以及一个WhiteboardRepositoryFake和它自己的测试子类。

在此处输入图像描述

为了确保实现的WhiteboardRepository行为符合预期,WhiteboardTests测试包定义了一个WhiteboardRepositoryTests子类XCTestCase

class WhiteboardRepositoryTests: XCTestCase {
  var repo: WhiteboardRepository?

  override func setUp() {
    if let repo = repo {
      // test setup here
    }
  }

  // test cases here

}

为了让客户端Whiteboard测试它的实现WhiteboardRepository,实现的测试类将实现的子类化,并将实现WhiteboardRepositoryTests的实例提供给测试子类,然后在运行测试时使用该实例。

例如,WhiteboardRepositoryFakeTests如下所示:

class WhiteboardRepositoryFakeTests: WhiteboardRepositoryTests {
    override func setUp() {
        repo = WhiteboardRepositoryFake()
        super.setUp()
    }

    // the test classes run, using the instance of WhiteboardRepositoryFake()
}

当然,这很好用,因为WhiteboardRepositoryFakeTests它在WhiteboardTests捆绑包中,所以WhiteboardRepositoryTests暴露于WhiteboardRepositoryFakeTests.

问题是:链接的应用程序Whiteboard需要创建自己的子类WhiteboardRepositoryTests来测试自己的实现,但是由于他们无权访问WhiteboardTests测试包,他们不知道WhiteboardRepositoryTests该类,因此无法对其进行子类化.

我有多个客户端正在使用Whiteboard,所以我不能简单地将WhiteboardRepositoryTests类复制到每个客户端中——我也不想这样做,因为Whiteboard定义WhiteboardRepository' 的行为是责任,所以WhiteboardRepositoryTests应该住在Whiteboard' 的测试包中。在一个理想的世界中,我可以将Whiteboard's test bundle 链接或注入到客户端的测试包中,以便WhiteboardRepositoryTests暴露给客户端的测试,但我不知道如何做到这一点。

有没有办法绕过这个障碍?如何WhiteboardRepositoryTests在客户端测试包中公开测试,以便客户端可以确保其实现WhiteboardRepository行为符合预期?

4

1 回答 1

2

这里的主要问题是 WhiteboardTests 目标很可能是一个测试目标,实际上并没有构建可链接的框架。这可以防止我们构建另一个从中导入和子类化的目标(您的客户端测试)。例如,您会注意到测试目标缺少用于从框架导出符号的正常 {TARGET_NAME}.h 头文件。我们需要的是一个构建框架但与 XCTest 链接的目标。客户项目的测试目标将与此框架链接,以导入和子类化它提供的 XCTestCase 类。那么该怎么办:

  1. 通过单击项目文件,然后单击编辑器 > 添加目标,在您的白板项目中创建框架构建目标。我们暂时称它为 WhiteboardAbstractTests。该目标将与 XCTest 链接并构建一个框架来提供您希望客户项目的测试子类化的超类。

  2. 现在,与 XCTest 链接有点奇怪,因为它们不再使其在 Xcode 中易于使用。但是,您仍然可以Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework在 Xcode 中找到 XCTest 框架并将其拖到 WhiteboardAbstractTests 目标文件夹中。

  3. 从这里开始,您应该能够在 WhiteboardAbstractTests 中定义 XCTestCase 子类,这些子类将内置到 WhiteboardAbstractTests.framework 中。

  4. 在您的客户端项目中,我假设 Whiteboard xcodeproj 以某种方式嵌套,可以是 Cocoapods、Carthage 或 git 子模块。找到 Whiteboard xcodeproj 文件并将其拖到 Xcode 中的客户端项目测试目标中。

  5. 在 Xcode 中选择客户端项目文件并转到 Build Phases。在目标依赖项下,单击加号按钮,您应该会看到来自 Whiteboard 的各种构建目标。选择 WhiteboardAbstractTests。这将确保 Xcode 在构建客户端测试之前构建抽象测试。

  6. 同样在 Build Phases 的 Link Binary With Libraries 下,选择 WhiteboardAbstractTests 以确保我们的测试目标与 Whiteboard 提供的抽象测试链接并可以导入类。

从这里您应该能够在您的客户端项目中运行测试,该项目将构建 WhiteboardAbstractTests,将您的客户端测试与它链接,并运行您的客户端测试,这些测试是抽象测试的子类。我已经快速测试了它,但如果你有问题,请告诉我。

PS我喜欢你的建筑风格。马丁·福勒在某处流下了喜悦的泪水。

于 2016-07-09T03:42:45.023 回答