-2

我正在学习第一次在 Go 中使用 mocks 进行单元测试,使用 gomock 的 mockgen 实用程序。我的单元测试工作正常,除了其中一个。被测方法有两个依赖项:一个依赖于数据库,另一个依赖于它调用 rest api 的外部服务。数据库的模拟 (mockRepo) 工作正常,因为被测方法正确调用模拟而不是实际的 repo 代码。然而,用于休息客户端的模拟继续调用实际的休息客户端,而不是模拟代码。我不知道为什么。有人可以解释原因并帮助解决吗?

这是我的单元测试:

func TestService_CreateWorkspace(t *testing.T) {
    ts := NewTestService(t)
    defer ts.mockCtrl.Finish()

    ts.mockClient.EXPECT().POST(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(&http.Response{StatusCode: 200}, nil)

    testWs := TestWorkspaces()["max-ws"]
    ts.mockRepo.EXPECT().Create(testWs).Times(1).Return(&testWs, nil)

    ws, err := ts.service.CreateWorkspace(&testWs)

    assert.Equal(t, testWs, ws)
    assert.NoError(t, err)
}

这是 NewTestService 的代码:

type TestService struct {
    mockCtrl   *gomock.Controller
    mockClient *MockRestClient
    mockRepo   *MockRepository
    service    Service
}

func NewTestService(t *testing.T) *TestService {
    mockCtrl := gomock.NewController(t)
    mockRepo := NewMockRepository(mockCtrl)
    mockClient := NewMockRestClient(mockCtrl)
    return &TestService{
        mockCtrl:   mockCtrl,
        mockClient: mockClient,
        mockRepo:   mockRepo,
        service:    NewService(mockRepo),
    }
}

将相同的模拟控制器分配给两个不同的模拟对象是否存在问题?不太确定这里发生了什么。任何帮助表示赞赏。

4

1 回答 1

0

我在上面建议的评论中以 Adrian 的身份解决了这个问题。我错过了将模拟客户端传递到 NewService 并最终将客户端参数添加到 NewService 的方法。

于 2019-04-24T11:56:01.760 回答