2016-07-09 31 views
1

我有一个框架Whiteboard,它封装了我的业务逻辑。我试图保持我的依赖倒置和解耦,因为Whiteboard取决于存储库,所以它声明了一个协议WhiteboardRepository,并且它期望与Whiteboard链接的客户端提供WhiteboardRepository的实现。如何将XCTestCases公开到外部测试包?

你可以在下面的屏幕截图中看到这个。还请注意WhiteboardTests组,其中包括WhiteboardRepositoryTests类以及WhiteboardRepositoryFake及其自己的测试子类。

enter image description here

为了确保预期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的测试包链接或注入到客户端的测试包中,以便WhiteboardRepositoryTests公开给客户端的测试,但我不明白我该如何做到这一点。

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

回答

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找到XCTest框架,并将其拖到Xcode的WhiteboardAbstractTests目标文件夹中。

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

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

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

  6. 同样在构建阶段中,在链接二进制库下,选择WhiteboardAbstractTests以确保我们的测试目标与Whiteboard提供的抽象测试链接并可以导入类。

从这里你应该可以运行在您的客户端项目的测试,这将建立WhiteboardAbstractTests,与之相联客户端的测试,并运行它继承抽象测试客户端测试。我已经很快测试过了,但是如果遇到问题,请告诉我。

P.S.我喜欢你的建筑风格。马丁福勒在某处流下了欢乐的泪水。

+0

这听起来像个好主意,但是当我尝试它时,我得到了'无法为'XCTest''加载底层模块。当我尝试向桥接头添加'#import '时,“加载模块”错误消失,但是在桥接头中出现'XCTest/XCTest.h'文件未找到'错误,这是特别令人困惑的,因为'XCTest.h'正好在我拖入的框架中。 –

+1

挂起,我想也许我明白了 - 至少是第一部分。我不得不从字面上将'XCTest'框架复制到我的项目中,并添加到框架搜索路径中以直接指向磁盘。然后,我必须将Whiteboard框架链接到“WhiteboardContractTests”,最后,我必须将测试文件目标成员资格赋予“WhiteboardTests”测试包。我现在就去尝试做客户端的工作。 –

+0

嗯,我对XCTest并不十分清楚,但我认为你已经明白了。 –

相关问题