testing - 如何测试延迟的 Go 语句?

标签 testing go deferred

如何测试 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/

相关文章:

GWT2.2 java.lang.RuntimeException : Deferred binding failed for a class (did you forget to inherit a required module? )

testing - 强制 FsCheck 生成 NonEmptyString,用于区分字符串类型的联合字段

go - 为什么 request.ParseForm() 耗尽 request.Body?

javascript - 如果没有打开页面,Phantom JS 可以运行吗

go - go中使用sleep时会执行哪个goroutine?

go - 将接口(interface)转换为结构

python - 如何在 Twisted 中触发延迟?

javascript - 引用对象的方法时如何使用 jQuery promises?

testing - 在我的案例中使用 Selenium IDE 或 Selenium Webdriver?

ruby-on-rails - 我想在 a/post 尝试设置数据库模型的 id 时呈现一条 json 消息