Golang имитирует контекстную панику

Итак, я делаю модульный тест в golang, используя mockery и свидетельствовать

Код теста выглядит следующим образом:

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)


person Dimas Angga Saputra    schedule 02.07.2020    source источник
comment
Как вы вводите mockAccountService для использования клиентом?   -  person Vasile Razdalovschi    schedule 02.07.2020
comment
Добавьте пожалуйста, добавьте определение функции для метода GetSavingAccount, чтобы увидеть параметры и возвращаемые типы. И, mock.Anything отлично работает для контекста, здесь должна быть другая проблема, не с контекстом.   -  person Vasile Razdalovschi    schedule 02.07.2020
comment
Вы не издеваетесь над context.Background(). Просто используйте context.Background(). Почему вы думаете, что вам нужен макет?   -  person Flimzy    schedule 02.07.2020
comment
@Flimzy Я попробовал твой совет, результат под вопросом, что я редактирую   -  person Dimas Angga Saputra    schedule 02.07.2020
comment
@VasileRazdalovschi Я редактирую свой вопрос, добавляя определение функции для метода GetSavingAccount и полный тестовый файл.   -  person Dimas Angga Saputra    schedule 02.07.2020


Ответы (1)


Итак, у вас есть метод:

GetSavingAccount(*context.Context,uint64,uint64,string,int64)

А вы издевались:

GetSavingAccount(*context.Context,uint64,uint64,string,int)

У вас есть разница в последнем параметре, ваша проблема int64 и int, поэтому вам нужно:

mockAccountService.On("GetSavingAccount", mock.Anything, a, a, "Hello", int64(1)).Return(...})

Для параметров контекста всегда используйте mock.Anything, это проще, чем имитировать контекст. Будьте осторожны с int/int64/int32 и другими типами, а также с параметрами указателя/структуры.

person Vasile Razdalovschi    schedule 02.07.2020
comment
@DimasAnggaSaputra Кроме того, если вам не нравится mock.Anything, вы можете сделать: ctx := context.Background() service.Mock(method, ctx,...) client.Do(ctx, ...) И вы пропущу этот макет. Что угодно, но это немного некрасиво, зависит от вашего вкуса :) - person Vasile Razdalovschi; 02.07.2020