无法通过 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
方法的调用,参数 1
和 2
传递给它,并且您还指定该调用应该 return 整数值 5
.
而是在这条线上
assert.Equal(t, 5, result.Add(5, 6))
您正在使用参数 5
和 6
.
调用方法 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)
您好,我正在尝试在 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
方法的调用,参数 1
和 2
传递给它,并且您还指定该调用应该 return 整数值 5
.
而是在这条线上
assert.Equal(t, 5, result.Add(5, 6))
您正在使用参数 5
和 6
.
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)