如何测试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
答案 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;。