我尝试测试函数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.完成将收到零