我发现很难在swift中的结构中存根方法。我现在可以使用我将在下面解释的方式来做到这一点,但我感觉不对,并希望得到一个意见。
我不使用任何第三方库进行存根,而是更喜欢覆盖我需要更改其结果的特定方法。在swift之前,我总是会使用类 - 所以很容易子类化并覆盖我在单元测试用例中需要模拟的方法。
现在我的大部分构造都是结构体,因为它们实际上不需要是引用类型。但是我不能在我的测试用例中覆盖任何方法。我目前正在使用如下所述的协议扩展 -
protocol AProtocol {
func a()
func b() // This calls a()
}
extension AProtocol {
func a(){
//Default implementation of a()
}
func b(){
//Default implementation of b() which also calls a()
}
}
struct A:AProtocol {
// Empty. struct A will be used by other classes/structs in the code
}
在我的测试用例中
struct TestA:AProtocol {
func a() {
Some mock implementation of a() so that b() can be tested
}
}
所以我的问题是 - 没有必要通过协议实现struct A.其他类或结构都不会实现AProtocol。但这是我可以模拟其单元测试方法的唯一方法。我认为关于协议扩展的WWDC会议也展示了这种单元测试方式,但基本上我不需要我的struct作为协议的实现。
在swift中是否有任何其他方法来存根结构方法(不使用任何第三方库)?或者是测试结构方法的更好方法。
答案 0 :(得分:1)
我将成为那个没有回答问题的人,并探讨你是否真的需要做你所说的我害怕的事情。
我的问题是你是否真的需要模拟结构。对于非变异函数,设置结构并测试返回值。对于变异函数,检查之后的状态是否符合预期。
对于结构,通常不应该有修改之外的副作用,因此不需要准确跟踪其他函数的调用。
可能足够接近答案的位稍微有用:
如果你真的在结构之外做副作用,我会建议你制作效果正在进行或注射的对象,这样只需要一个额外的测试,你可以注入一个替代的模拟对象来接收副作用叫。