如何测试 doStuff
函数? ( Playground :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 playground 只允许 package main
最佳答案
长话短说
To test a panicked state the assertions should be deffered
看起来要测试 panic
状态,我们应该延迟
测试断言:
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
,因此应该推迟断言,以便它们处于“paniced scope” .
关于testing - 如何测试延迟的 Go 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630675/