Неожиданный вызов mock (gomock) gRPC

У меня есть служба gRPC (скажем, svc1), которая вызывает другую службу gRPC, используя ее заглушку gRPC (скажем, svc2_client).

Я создал макет клиента для svc2_client. Модульные тесты согласно документации работают нормально, т.е. svc2_client тестируется с использованием созданного макета.

Однако у меня есть svc1, как показано ниже:

// Synonymous to proto service generated.
type Svc1 struct {
    rt svc2pb.Svc2Client
}

// Constructor to get Service.
func NewSvc1(rt svc2pb.Svc2Client) *Svc1 {
    return &Svc1{rt}
}
...
...

Ожидаемое поведение:
Ожидание успеха

Воспроизведение
Действия по воспроизведению поведения:

Возвращает ошибку:

=== RUN   TestMethod1Svc1

    TestMethod1Svc1: svc1.go:40: Unexpected call to *mock_svc2client.MockSvc2Client.Method1([context.Background.WithDeadline(2020-06-22 10:14:25.620736 +0530 IST m=+3.002262784 [2.999757626s]) key1:"1"  } ]) at ...server/mocks/svc2client_mock.go:65 because: there are no expected calls of the method "Method1" for that receiver
--- FAIL: TestMethod1Svc1 (0.00s)

Новичок в го, не могли бы вы мне помочь?

Дополнительная информация:

  • gomock mode (источник): источник
  • версия gomock или git ref: github.com/golang/mock v1.4.3
  • версия golang: версия go1.14 darwin / amd64

person nukul    schedule 22.06.2020    source источник
comment
Извините, я не понял - Работает - Когда макет клиента проверяется путем генерации теста над ним. не работает - как указано выше, то есть когда служба должна вызвать заглушку клиента grpc (которая имитируется). модульное тестирование этой службы дает сбой, в то время как модульное тестирование непосредственно через клиентскую заглушку работает нормально.   -  person nukul    schedule 22.06.2020
comment
Вы нашли способ? дайте нам знать здесь. я застрял с той же проблемой.   -  person amolgautam    schedule 01.07.2020


Ответы (2)


Вы пытаетесь вызвать функцию, над которой еще не было издевательства.

По сути, когда вы выполняете mock_client и вызываете в нем функции, вы должны убедиться, что функции также являются имитируемыми. Вы также должны предоставить пользовательские входы и пользовательские выходы для своей имитируемой функции.

Вы можете обратиться к этому: gomock-blog

вы можете видеть, что эта строка crankingCircuit.EXPECT().RotateShaft().Return(nil).Times(2) говорит mock_client ожидать вызова функции RotateShaft

В зависимости от API вам придется изменить входные аргументы и выходные аргументы в вашей фиктивной функции.

person amolgautam    schedule 01.07.2020

Может быть и такой случай, забыл вызвать функцию mock().

for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
        tt.mock(tt.input)
        s := NewServiceServer(dbObject, queueObject)
        _, err := s.ListConstraint(ctx, tt.input)
        if (err != nil) != tt.isErr {
            t.Errorf("ServiceServer.ListC() error = %v, wantErr %v", err, tt.isErr)
            return
        }

    })
}
person infiniteLearner    schedule 08.12.2020