Я пытаюсь создать модульный тестовый пример следующего метода 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)
Все работает отлично. Но мне любопытно, так ли это делают все или есть какое-то лучшее решение.