Testing 如何测试延迟Go语句?
如何测试Testing 如何测试延迟Go语句?,testing,go,deferred,Testing,Go,Deferred,如何测试doStuff功能?(游乐场:) 换句话说:如何测试使用defer语句的代码?应该使用什么一般策略来测试延迟呼叫?如果没有通用实践,如何测试此特定代码 PS:Go游乐场只允许包主TL;博士 为了测试恐慌状态,应该改变断言 看起来,要测试一个恐慌状态,我们应该延迟测试断言: package myPackage import "testing" func TestLock(t *testing.T) { defer func (){ if locked == tr
doStuff
功能?(游乐场:)
换句话说:如何测试使用defer
语句的代码?应该使用什么一般策略来测试延迟呼叫?如果没有通用实践,如何测试此特定代码
PS:Go游乐场只允许包主TL;博士
为了测试恐慌状态,应该改变断言
看起来,要测试一个恐慌
状态,我们应该延迟
测试断言:
package myPackage
import "testing"
func TestLock(t *testing.T) {
defer func (){
if locked == true {
t.Error("Expected locked to be false but got locked =", locked)
}
}() // do assertions on panicked state ↑
defer func (){ recover() }() // recover from panic ↑
doStuff() // this will panic and code execution will flow up ↑
// and, of course, execution will never reach below this line ---
// don't put assertions here
}
发生这种情况是因为在doStuff()
下面没有执行任何代码,因为我们正在模拟一个panic
,因此应该推迟断言,以便它们位于“panicked scope”上。出于什么目的?您是否试图断言延迟方法已执行?是的,我试图断言延迟调用具有预期效果。在该示例中,预期效果是将“unlocked”打印到stdout。要测试sync.Mutex
,您需要在应该已解锁时尝试解锁它。这将导致您需要截获的运行时错误。“解锁解锁m。如果m在进入解锁时未锁定,则为运行时错误”。实际上没有任何通用的答案,因为测试总是检查延迟函数是否使程序处于预期状态。好的,找到了答案\o/颠倒顺序,延迟是一个堆栈,因此在恢复之前将调用第二个函数。捕捉得好!我想我试着创建了一个通用的示例,但我所做的是在这里用一个小的代码片段来表达更加复杂和困难。在我的例子中,锁取决于其他地方存在的许多东西,而不是bool变量,因此需要对其进行测试:)无论如何,教训可能是:“要测试恐慌状态,也需要推迟测试”。
package myPackage
import "testing"
func TestLock(t *testing.T) {
defer func (){
if locked == true {
t.Error("Expected locked to be false but got locked =", locked)
}
}() // do assertions on panicked state ↑
defer func (){ recover() }() // recover from panic ↑
doStuff() // this will panic and code execution will flow up ↑
// and, of course, execution will never reach below this line ---
// don't put assertions here
}