为了账号安全,请及时绑定邮箱和手机立即绑定

如何测试依赖是否被正确调用

如何测试依赖是否被正确调用

Go
料青山看我应如是 2023-05-15 14:53:23
在 Go 中,我将如何测试是否以正确的方式调用了模拟依赖项。如果我有一个接受依赖接口的结构,注入后我希望能够测试原始模拟对象是否已被调用。我在这个例子中的当前代码我看不到结构值已经改变。如果我更改我的代码以通过引用传递它会触发错误:s.simpleInterface.Call 未定义(类型 *SimpleInterface 是指向接口的指针,而不是接口)type SimpleInterface interface {    Call()}type Simple struct {    simpleInterface SimpleInterface}func (s Simple) CallInterface() {    s.simpleInterface.Call()}type MockSimple struct {    hasBeenCalled bool}func (ms MockSimple) Call() {    ms.hasBeenCalled = true}func TestMockCalled(t *testing.T) {    ms := MockSimple{}    s := Simple{        simpleInterface: ms,    }    s.CallInterface()    if ms.hasBeenCalled != true {        t.Error("Interface has not been called")    }}
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我看到三种简单的方法来解决这个问题:


1- 更改 Call 方法的签名以接收指向 MockSimple 的指针,并在实例化 Simple 结构时,为其提供 mock 的地址:


func (ms *MockSimple) Call() {

    ms.hasBeenCalled = true

}


func TestMockCalled(t *testing.T) {

    ms := MockSimple{}

    s := Simple{

        simpleInterface: &ms,

    }

    s.CallInterface()


    if ms.hasBeenCalled != true {

        t.Error("Interface has not been called")

    }

}

2-不是最干净的解决方案,但仍然有效。如果您真的不能使用#1,请使用它。在其他地方声明“hasBeenCalled”并更改您的 MockSimple 以保存指向它的指针:


type MockSimple struct {

    hasBeenCalled *bool

}


func (ms MockSimple) Call() {

    *ms.hasBeenCalled = true

}


func TestMockCalled(t *testing.T) {

    hasBeenCalled := false

    ms := MockSimple{&hasBeenCalled}

    s := Simple{

        simpleInterface: ms,

    }

    s.CallInterface()


    if hasBeenCalled != true {

        t.Error("Interface has not been called")

    }

}

3- 可能是一个非常糟糕的解决方案:使用全局变量,所以我只会将其用作最后的手段(始终避免全局状态)。使“hasBeenCalled”成为全局变量并从方法中对其进行修改。


var hasBeenCalled bool


type MockSimple struct{}


func (ms MockSimple) Call() {

    hasBeenCalled = true

}


func TestMockCalled(t *testing.T) {

    ms := MockSimple{}

    s := Simple{

        simpleInterface: ms,

    }

    s.CallInterface()


    if hasBeenCalled != true {

        t.Error("Interface has not been called")

    }

}


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信