【发布时间】:2018-06-09 08:00:58
【问题描述】:
您好,我正在尝试在 GO 中模拟一个结构。我正在使用作证来做到这一点。但我似乎无法让它发挥作用,现在也不知道我做错了什么。以下是我拥有的示例 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)= 期望调用Add,参数为1和2,返回值5。实际调用result.Add(5, 6)传递5和6。如您所知,这两个数字与1和2不同。 -
另外你模拟的是计算结果
return args.Int(0) + args.Int(1),就像一个正常的实现一样。这不是你做模拟的方式。您的模拟应该返回它的第 0 个返回值,即您传递给Return方法 (5) 的那个。所以模拟返回语句实际上应该是return args.Int(0)。 -
另外,请理解
args值包含指定的 return 参数(传递给Return方法的参数),args值 确实不持有输入参数。 -
@mkopriva 非常感谢您指出这个参数和参数。因为老实说我不知道它是做什么的,我只是从在线教程中复制并做了一些修改。感谢您澄清这一点。您能否将您的答案移至实际答案,以便我可以将其批准为解决方案