我尝试测试函数StartP,Start()应该调用1次,Done()应该被调用1次
但我有问题,代码将在运行此步骤之后等待信道<-ps.Done()
如何测试chan类型函数?
// production code
func (s *vService) StartP(ctx context.Context, reason string) error {
    ps, err := s.factory.CreateVService(ctx)
    if err != nil {
        return err
    }
    ps.Start(reason)
    err = <-ps.Done()   // code stop here to wait ? how can i test ?
    if err != nil {
        return err
    }
    return nil
}
我使用gomock模拟PServiceInterface
// interface
type PServiceInterface interface {
    Start(reason string)
    Done() <-chan error
}
gomock-gen这个函数
// Done mocks base method
func (m *MockPServiceInterface) Done() <-chan error {
        m.ctrl.T.Helper()
        ret := m.ctrl.Call(m, "Done")
        ret0, _ := ret[0].(<-chan error)
        return ret0
}
// test code
func Test_StartP(t *testing.T) {
    mockCtrl := gomock.NewController(t)
    defer mockCtrl.Finish()
    mockPService := mockpservice.NewMockPInterface(mockCtrl)
    vService := &vService {
                      factory: &servicefactory.FakeServiceFactory{
                                 MockPService: mockPService
                               }
                    }
    mockPService.EXPECT().Start("reason").Times(1).Return()
    mockPService.EXPECT().Done().Times(1).DoAndReturn(func() chan error {
        return nil
    })
    err := vService.StartP(context.Background(), "reason")
    assert.Equal(t, nil, err)
}
我希望<-ps.完成将收到零