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

assert: mock: 我不知道要返回什么,因为方法调用是意外的

assert: mock: 我不知道要返回什么,因为方法调用是意外的

Go
青春有我 2023-01-03 14:21:25
我正在尝试使用 testify 在 Go 上创建单元测试。我要测试的函数非常简单,它会启动一个 SQL 事务,然后通过回购层从数据库中获取值,然后计算这些值。但是每当我尝试运行单元测试时,我总是遇到这个错误。# go test -v usecase/calculate_test.go usecase/calculate.go usecase/other_related_usecase.go === RUN   Test_Calculate[2022-07-15 08:42:30] INFO: Start Calculation--- FAIL: Test_Calculate (0.00s)panic: assert: mock: I don't know what to return because the method call was unexpected.        Either do Mock.On("BeginTxx").Return(...) first, or remove the BeginTxx() call.        This method was unexpected:                BeginTxx()        at: [sql_repository.go:1 calculate.go:4 calculate_test.go:2] [recovered]        panic: assert: mock: I don't know what to return because the method call was unexpected.        Either do Mock.On("BeginTxx").Return(...) first, or remove the BeginTxx() call.        This method was unexpected:                BeginTxx()        at: [sql_repository.go:1 calculate.go:4 calculate_test.go:2]据我所知,我认为这是因为它无法在单元测试中找到预期的方法调用。但是,问题是我已经在onSQLMock字段中定义了方法调用。func Test_Calculate(t *testing.T) {  testCases := []struct {    name string    id int64    onSQLMock func(sqlMock *mocks.SQLRepository)    onOtherFuncMock func(otherFuncMock *mocks.OtherFuncMock)    wantError bool    expectedError string  }{    {     name: "Successfully Calculated",     onSQLMock: func(sqlMock *mocks.SQLRepository) {       var tx *sqlx.Tx       sqlRepo.On("BeginTxx").Return(tx, nil)     },     onOtherFuncMock: func(otherFuncMock *Mocks.OtherFuncMock) {       // do something here     },     wantError: false,    },{     name: "Failed to calculate",     onSQLMock: func(sqlMock *mocks.SQLRepository) {       var tx *sqlx.Tx       sqlRepo.On("BeginTxx").Return(tx, errors.New("Failed to begin tx")     },     onOtherFuncMock: func(otherFuncMock *mocks.OtherFuncMock) {       // do something here     },     wantError: true,     expectedError: "Failed to begin tx",    },  } }
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

你实际上并没有使用你的onSQLMock任何地方。usecase在将模拟存储库传递给实例之前使用它


mockRepo := new(mocks.SQLRepository)

testCase.onSQLMock(mockRepo)

同样使用函数的参数:


  onSQLMock: func(sqlMock *mocks.SQLRepository) {

       var tx *sqlx.Tx

       sqlMock.On("BeginTxx").Return(tx, nil)

     },


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

添加回答

举报

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