gpt4 book ai didi

go - 无法通过 Testify Mock 对象错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:40 26 4
gpt4 key购买 nike

您好,我正在尝试在 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 传递给它,并且您还指定该调用应返回整数值 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 方法提供给它的值。

你可以这样做的方法是使用 args Called 方法调用返回的值,此值将保存 Return 方法的参数,其索引顺序与传递给 Return 的顺序相同。

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

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

可以使用 Int 实用方法访问,并将第 0 个索引传递给它。即 return args.Int(0) 将返回整数值 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)
}

关于go - 无法通过 Testify Mock 对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com