无法通过 Testify Mock 对象错误

Cannot pass Testify Mock object error

您好,我正在尝试在 GO 中模拟一个结构。我正在使用 testify 来做到这一点。但我似乎无法让它工作,现在也不知道我做错了什么。下面是示例 main.go 和 main_test.go 我的文件

// Arithmetic ...
type Arithmetic interface {
    Add(int, int) int
    Subtract(int, int) int
}

// MathOperation ...
type MathOperation struct {}

// GetNewArithmetic ...
func GetNewArithmetic(obj Arithmetic) Arithmetic {
    if obj != nil {
        return obj
    }

    return MathOperation{}
}

// Add ...
func (a MathOperation) Add(num1 int, num2 int) int {
    return num1 + num2
}

// Subtract ...
func (a MathOperation) Subtract(num1 int, num2 int) int {
    return num1 - num2
}

这是我的测试文件

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/mock"
)

type MyMock struct {
    mock.Mock
}

func (m *MyMock) Add(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0) + args.Int(1)
}

func (m *MyMock) Subtract(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0) + args.Int(1)
}

func TestDoComputation(t *testing.T) {
    testobj := new(MyMock)

    testobj.On("Add", 1, 2).Return(5)

    // a := GetNewArithmetic(testobj)

    result := GetNewArithmetic(testobj)

    assert.Equal(t, 5, result.Add(5, 6))
    testobj.AssertExpectations(t)
}

我收到这个错误

--- FAIL: TestDoComputation (0.00s)
panic:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6

The closest call I have is:

Add(int,int)
            0: 1
            1: 2


 [recovered]
        panic:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6

The closest call I have is:

Add(int,int)
            0: 1
            1: 2

goroutine 13 [running]:
testing.tRunner.func1(0xc420106870)
        /usr/lib/golang/src/testing/testing.go:711 +0x2d2
panic(0x701160, 0xc420011070)

我不知道如何修复,因为这是我第一次使用 Go 并使用 Testify 进行单元测试。如果有人可以看一下并拥有它的工作版本,我们将不胜感激。谢谢

testobj.On("Add", 1, 2).Return(5)

意味着您希望 testobj 模拟接收对其 Add 方法的调用,参数 12 传递给它,并且您还指定该调用应该 return 整数值 5.

而是在这条线上

assert.Equal(t, 5, result.Add(5, 6))

您正在使用参数 56.

调用方法 Add

这会导致您遇到错误:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6
// this is result.Add(5, 6), the 0: and 1: are indexes of the actually passed in aguments.

The closest call I have is:

Add(int,int)
            0: 1
            1: 2
// this is testobj.On("Add", 1, 2), and 0: and 1: are indexes of the expected arguments.

除此之外,您的模拟实现正在尝试计算 return 值。这不是模拟应该做的。模拟应该 return 通过 Return 方法提供给它的值。

您可以这样做的方法是使用 Called 方法调用中的 args 值 return,该值将保存 Return 方法的参数索引按照相同的顺序将它们传递给 Return.

所以你在这一行Return传递给Return的整数值5

testobj.On("Add", 1, 2).Return(5)

可以使用 Int 实用程序方法访问,并将第 0 个索引传递给它。即 return args.Int(0) 将 return 整数值 5.

所以你的测试文件应该看起来更像这样:

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/mock"
)

type MyMock struct {
    mock.Mock
}

func (m *MyMock) Add(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0)
}

func (m *MyMock) Subtract(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0)
}

func TestDoComputation(t *testing.T) {
    testobj := new(MyMock)

    testobj.On("Add", 1, 2).Return(5)

    // a := GetNewArithmetic(testobj)

    result := GetNewArithmetic(testobj)

    assert.Equal(t, 5, result.Add(1, 2))
    testobj.AssertExpectations(t)
}

在testify/mock包中

testobj.On("Add", 1, 2).Return(5)

在上一行中,它告诉模拟对象每当我们使用以下参数调用 Add 方法时,它应该 return 5. Return 用于将结果传递给给定的方法参数。

assert.Equal(t, 5, result.Add(5, 6))

在这一行中,您要求将预期结果与您在传递 1 和 2 时指定的函数 call.Earlier 相匹配,该函数应该 return 5 但在 Equal 语句中您传递的是值 5 和 6

您所要做的就是用正确的值更改任何一行。

testobj.On("Add", 5, 6).Return(5)