在编写测试时,我必须修补一个方法以检查它是否被调用,这是我的代码:

import "fmt"

type myStruct struct {}

func (myObject *myStruct) firstMethod() {
    myObject.SecondMethod()
}
func (myObject *myStruct) SecondMethod() {
    fmt.Println("Inside the original SecondMethod") //test fails if I remove this
}

这是测试:
import (
    "reflect"
    "testing"
    "github.com/bouk/monkey"
    "github.com/stretchr/testify/assert"
    "fmt"
)
func TestThatSecondMethodIsCalled(t *testing.T) {
    myObject := &myStruct{}

    wasCalled := false
    monkey.PatchInstanceMethod(
        reflect.TypeOf(myObject),
        "SecondMethod",
        func(*myStruct) {
            fmt.Println("Inside the replacement of SecondMethod")
            wasCalled = true
        },
    )

    myObject.firstMethod()
    assert.True(t, wasCalled)
}

如果我像这样运行测试,它将通过,但是如果我从SecondMethod中删除fmt.Println(),则测试将失败(该测试使用方法的原始主体,而不是已修补的主体)。

另外,如果我使用Goland的调试功能,即使SecondMethod的正文为空,测试也会通过。

最佳答案

这是由编译器的内联优化引起的,添加-gcflags="-N -I"将禁用它。

关于unit-testing - 删除fmt.Println()时,golang中的猴子修补失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51521539/

10-13 05:09