gpt4 book ai didi

unit-testing - Golang模拟上下文 panic

转载 作者:行者123 更新时间:2023-12-01 22:33:50 25 4
gpt4 key购买 nike

所以我正在使用mockerytestify在golang中进行单元测试
测试代码如下:

const bufSize = 1024 * 1024

var lis *bufconn.Listener

var mockAccountService = &mocks.AccountService{}

func init() {
lis = bufconn.Listen(bufSize)
s := grpc.NewServer()
RegisterAccountManagementHandlerServer(s, &server{mockAccountService})
go func() {
if err := s.Serve(lis); err != nil {
log.Fatalf("Server exited with error: %v", err)
}
}()
}

func bufDialer(context.Context, string) (net.Conn, error) {
return lis.Dial()
}

func TestSayHello(t *testing.T) {

var a uint64 = 1

ctx := context.Background()

conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure())
if err != nil {
t.Fatalf("Failed to dial bufnet: %v", err)
}
defer conn.Close()
client := NewAccountManagementHandlerClient(conn)

mockAccountService.On("GetSavingAccount", context.Background(), a, a, "Hello", 1).Return(&models.SavingAccount{
CustomerID: 1,
ID: 1,
CardNo: "Hello",
SavingProductID: 1,
Balance: 0,
Status: 1,
})

resp, err := client.GetSavingAccount(ctx, &GetSavingAccountDataRequest{
Id: 1,
CustomerId: 1,
CardNo: "Hello",
SavingProductId: 1,
})

if err != nil {
t.Fatalf("SayHello failed: %v", err)
}
fmt.Printf("Response: %+v", resp)
// Test for output here.
但是我得到这样的错误:
panic: 

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

GetSavingAccount(*context.valueCtx,uint64,uint64,string,int64)
0: &context.valueCtx{Context:(*context.valueCtx)(0xc000115260), key:grpc.streamKey{}, val:(*transport.Stream)(0xc0004a2200)}
1: 0x1
2: 0x1
3: "Hello"
4: 1

The closest call I have is:

GetSavingAccount(mock.AnythingOfTypeArgument,uint64,uint64,string,int)
0: "&context.ValueCtx"
1: 0x1
2: 0x1
3: "Hello"
4: 1

我应该为模拟 context.Background()传递什么值?
我尝试过 mock.AnythingOfType("&context.emptyCtx")mock.Anything无效
谢谢
编辑:
我试过了
mockAccountService.On("GetSavingAccount", context.Background(), a, a, "Hello", 1).Return(...})
得到:
GetSavingAccount(*context.valueCtx,uint64,uint64,string,int64)
0: &context.valueCtx{Context:(*context.valueCtx)(0xc000021290), key:grpc.streamKey{}, val:(*transport.Stream)(0xc000522100)}
...
The closest call I have is:

GetSavingAccount(*context.emptyCtx,uint64,uint64,string,int)
0: (*context.emptyCtx)(0xc00002a080)
...
GetSavingAccount方法的方法定义为: func (a *accountService) GetSavingAccount(ctx context.Context, customerID, id uint64, cardNo string, savingProductId int64) (*models.SavingAccount, error)

最佳答案

因此,您有方法:

GetSavingAccount(*context.Context,uint64,uint64,string,int64)
而且你 mock :
GetSavingAccount(*context.Context,uint64,uint64,string,int)
您在最后一个参数上有所不同,您的问题是 int64 int ,因此您需要:
mockAccountService.On("GetSavingAccount", mock.Anything, a, a, "Hello", int64(1)).Return(...})
对于上下文参数,请始终使用模拟。任何东西,比模拟上下文更容易。注意int/int64/int32和其他类型,也要注意指针/结构参数。

关于unit-testing - Golang模拟上下文 panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62695766/

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