Pointers 防止在测试时更改结构指针值

Pointers 防止在测试时更改结构指针值,pointers,go,Pointers,Go,如何防止对结构值所做的任何更改仅保留在子测试中,即保持它们不受子测试之外的影响。我无法对结构进行任何更改,因为它们是使用swagger codegen自动生成的。以下是一个例子: 主程序包 进口( “测试” ) func TestTyre(t*testing.t){ 轮胎结构型式{ 颜色*字符串 } 类型车辆结构{ 轮胎 } 颜色:=“黑色” tyreForTest:=轮胎{Color:&Color} 预期颜色:=颜色 t、 运行(“否定测试”,func(t*testing.t){ tyre:=

如何防止对结构值所做的任何更改仅保留在子测试中,即保持它们不受子测试之外的影响。我无法对结构进行任何更改,因为它们是使用swagger codegen自动生成的。以下是一个例子:

主程序包
进口(
“测试”
)
func TestTyre(t*testing.t){
轮胎结构型式{
颜色*字符串
}
类型车辆结构{
轮胎
}
颜色:=“黑色”
tyreForTest:=轮胎{Color:&Color}
预期颜色:=颜色
t、 运行(“否定测试”,func(t*testing.t){
tyre:=tyreForTest//如果没有任何指针变量,它就可以工作
*tyre.Color=“blue”//这里我希望值仅针对此子测试进行更改
车辆:=车辆{轮胎:轮胎}
实际颜色:=vehicle.Tyre.Color
确定:=(预期颜色==*实际颜色)
如果可以的话{
t、 错误(“颜色应为蓝色”)
}
})
t、 运行(“阳性测试”,func(t*testing.t){
轮胎:=tyreForTest
车辆:=车辆{轮胎:轮胎}
实际颜色:=vehicle.Tyre.Color
确定:=(预期颜色==*实际颜色)
如果!好的{
t、 错误(“颜色应为黑色,而不是“,*actualTyreColor”)
}
})
}
输出:

=== RUN   TestTyre
=== RUN   TestTyre/negativeTest
=== RUN   TestTyre/positiveTest
    TestTyre/positiveTest: prog.go:39: Color should be black, instead of blue
--- FAIL: TestTyre (0.00s)
    --- PASS: TestTyre/negativeTest (0.00s)
    --- FAIL: TestTyre/positiveTest (0.00s)
FAIL

您可以通过在测试用例之间不共享
颜色
变量来防止这种情况-您的每个测试用例都会获得一个新的
轮胎
,但它们都指向存储颜色值的相同内存。因此,当您在阴性测试用例中更改
tyre.Color
时,您会更新变量
Color
的值,其他测试用例
tyre.Color
也会指向该变量

简单的解决方案是使用一个函数
makeTyre()
,该函数使用自己的内存获取全新的轮胎,以存储颜色并获取每个测试用例的轮胎:

主程序包
进口(
“测试”
)
轮胎结构型式{
颜色*字符串
}
类型车辆结构{
轮胎
}
func makeTyre()轮胎{
颜色:=“黑色”
返回轮胎{Color:&Color}
}
func TestTyre(t*testing.t){
预期颜色:=“黑色”
t、 运行(“否定测试”,func(t*testing.t){
轮胎:=制造轮胎()
*轮胎颜色=“蓝色”
车辆:=车辆{轮胎:轮胎}
实际颜色:=vehicle.Tyre.Color
确定:=(预期颜色==*实际颜色)
如果可以的话{
t、 错误(“颜色应为蓝色”)
}
})
t、 运行(“阳性测试”,func(t*testing.t){
轮胎:=制造轮胎()
车辆:=车辆{轮胎:轮胎}
实际颜色:=vehicle.Tyre.Color
确定:=(预期颜色==*实际颜色)
如果!好的{
t、 错误(“颜色应为黑色,而不是“,*actualTyreColor”)
}
})
}

这是无法阻止的。只是不要共享变量。手动创建颜色的副本,并将副本的地址指定为指针字段。github上也应该有第三方软件包,如果您不想手动实现deepcopy的话,它们可以实现。