我有一个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
行为符合预期?