Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 如何测试延迟Go语句?_Testing_Go_Deferred - Fatal编程技术网

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
}