【发布时间】:2016-07-09 02:34:10
【问题描述】:
我有一个框架Whiteboard,它封装了我的业务逻辑。我试图保持我的依赖倒置和解耦,因此由于Whiteboard 依赖于存储库,它声明了一个协议WhiteboardRepository,并且它希望链接到Whiteboard 的客户端提供WhiteboardRepository 的实现。
您可以在下面的屏幕截图中看到这一点。还要注意WhiteboardTests 组,其中包括WhiteboardRepositoryTests 类以及WhiteboardRepositoryFake 及其自己的测试子类。
为确保WhiteboardRepository 的实现按预期运行,WhiteboardTests 测试包定义了XCTestCase 的WhiteboardRepositoryTests 子类:
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 类复制到每个客户端中——我也不想这样做,因为定义 WhiteboardRepository 是 Whiteboard 的责任的行为,所以WhiteboardRepositoryTests 应该存在于Whiteboard 的测试包中。在理想情况下,我可以将Whiteboard 的测试包链接或注入到客户端的测试包中,以便WhiteboardRepositoryTests 暴露于客户端的测试中,但我不知道该怎么做。
有没有办法绕过这个障碍?如何将 WhiteboardRepositoryTests 公开给客户端测试包中的测试,以便客户端可以确保其对 WhiteboardRepository 的实现按预期运行?
【问题讨论】:
标签: xcode swift xctest dependency-inversion