如何测试延期的Go语句?

时间:2014-12-24 02:29:30

标签: testing go deferred

如何测试doStuff功能? (游乐场:http://play.golang.org/p/aPFSlaBLgX

package myPackage

var locked = false

func doStuff() {
    defer unlock()
    lock()
    // some task that can cause errors
    // need to test if lock was really unlocked
    // this is just a simple example, things can go complex on real world
    panic("!")
}

func lock() {
    locked = true
}

func unlock() {
    locked = false
}

换句话说:如何测试使用defer语句的代码?应该使用哪些通用策略来测试延期呼叫?如果没有通用的做法,如何测试这个特定的代码?

PS:Go操场只允许package main

1 个答案:

答案 0 :(得分:0)

TL; DR

  

为了测试恐慌状态,应该断言断言

看起来要测试一个panic状态我们应该defer测试断言:

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之下没有执行任何代码,因此应该延迟断言,以便它们处于恐慌范围内#34;。