Как смоделировать метод с использованием каналов и WaitGroup по testify - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать модульный тестовый пример следующего метода struct

func(abc Abc) methodA(){
      response1 := make(chan model.Model1, 1)
      response2 := make(chan model.Model2, 1)
      defer close(response1)
      defer close(response2)
      var wg sync.WaitGroup
      wg.Add(1)
      go service.HitWebServiceA(response1, &wg)
      wg.Add(1)
      go service.HitWebServiceB(response2, &wg)
      resp1 := <- response1
      resp2 := <- response2
        ....... //logic to consolidate the response
}

Мой тестовый пример такой, как показано ниже

func( suite ControllerTestSuite) Test(){
     expectedResponse := .....
     suite.mock.EXPECT().HitWebServiceA(response1, &wg).Do(func(){
         response1 <- rsp1
         wg.Done()
     })
     suite.mock.EXPECT().HitWebServiceB(response2, &wg).Do(func(){
         response2 <- rsp1
         wg.Done()
     })
     rsp1 := <- response1
     rsp2 := <- response2
     .....
    // r = response1+response2 
    // suite.Equal(expectedResponse,r)
}

Проблема в том, что тестовый пример никогда не завершается. Я думаю, что это потому, что каналы, которые были созданы в methodA, все еще ждут ввода, так как методы HitServiceA и HitServiceB подвергаются проверке и передаются с другими каналами, созданными в TestCase. В качестве обходного пути я создал другую структуру, которая может возвращать каналы и рабочую группу.

func(channelStruct ChannelStruct) getChannel() (chan model.Model1, chan model.Model2){
     return make(chan model.Model1, 1), make(chan model.Model2, 1)
}

В моем тестовом примере я также высмеял эту структуру и пропустил каналы, созданные в тестовом примере

   suite.mockChnl.EXPECT().getChannel().Return(response1, response2)

Все работает отлично. Но мне любопытно, так ли это делают все или есть какое-то лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...