Thank you Gregor. As this is just to make unit test work, if I add waitgroup in the code, will this affect the real streaming logic? Is that OK, I check if is it a mock function functionB called, then I tell it to sleep for a sec before return.
On Thursday, September 10, 2020 at 5:42:21 PM UTC+10 be...@pferdewetten.de wrote: > Right, I wanted to write something about the goroutine and forgot about > it. Sorry about that. > > The problem here could be that in the code you posted there's nothing > waiting on any result from the goroutine, and if the test exits quickly > enough, it might not get scheduled. > > In general, whenever a goroutine is created, you should have some idea > of when and how it gets to run and when it stops running, and how other > goroutines wait for it to do its job. > > You could do this for example by controlling the lifetime of the > goroutine with a sync.WaitGroup. Pass in a WaitGroup and call Done() on > it when the goroutine returns (probably as a deferred call), then call > Wait() in some other goroutine (for example in your main function or in > the TestFoo function) so there's some sort of ordering enforced. > > In general, you'll need some way of signalling "I'm done copying stuff > from zipReader to zipWriter" in the goroutine, and you'll need to > arrange for some other, longer lived, goroutine to wait for that signal. > > > On 10.09.20 09:34, Yvonne Zhang wrote: > > Thank you Gregor for your quick reply! > > > > Anything special I need to think about this go routine logic in my unit > > test. It might be still running after test returns..? > > > > On Thursday, September 10, 2020 at 5:26:13 PM UTC+10 > > be...@pferdewetten.de wrote: > > > > If I were you, I'd pass in an interface value to functionA with the > > signature > > > > type Ber interface{ > > functionB(io.Reader, io.Writer) > > } > > > > (assuming that zipReader is an io.Reader, zipWriter is an io.Writer, > > you > > may have to adjust this a bit). > > > > Then make your mock functionB a method on a type that implements the > > Ber > > interface, the same for the real functionB. In unit tests, pass in an > > instance of the type with the mock method, in real life, pass in an > > instance of the type with the real method. > > > > Note that the types could be as simple as > > > > type mockB struct{} > > func (m mockB) functionB(...) > > > > On 10.09.20 09:15, Yvonne Zhang wrote: > > > Hi, > > > I have a function streaming a zipreader to browser. It is like this. > > > func functionA(....)(body io.ReadCloser, err error){ > > > > > > // some logic to get a zipreader > > > > > > body, pipeWriter := io.Pipe() > > > zipWriter := zip.NewWriter(pipeWriter) > > > > > > go func(){ > > > // err := functionB(zipReader, zipWriter)call another > > function to > > > prepare files and write to zipwriter > > > If err != nil{ > > > zipWriter.Close() > > > _ = pipeWriter.CloseWithError(err) > > > return > > > } > > > zipWriter.Close() > > > pipeWriter.Close() > > > }() > > > return > > > } > > > > > > My question is about unit test about this functionA. I have mock for > > > functionB. How do I write unit test for functionA with the mock > > > functionB. It seems my unit test does not work well when it goes > > into > > > the goroutine. > > > Many thanks! > > > > > > -- > > > You received this message because you are subscribed to the Google > > > Groups "golang-nuts" group. > > > To unsubscribe from this group and stop receiving emails from it, > > send > > > an email to golang-nuts...@googlegroups.com > > > <mailto:golang-nuts...@googlegroups.com>. > > > To view this discussion on the web visit > > > > > > https://groups.google.com/d/msgid/golang-nuts/4ca0817a-f1f7-44a9-be3d-3584bcb61b8an%40googlegroups.com > > > > > > > < > https://groups.google.com/d/msgid/golang-nuts/4ca0817a-f1f7-44a9-be3d-3584bcb61b8an%40googlegroups.com?utm_medium=email&utm_source=footer > >. > > > > > > -- > > Gregor Best > > be...@pferdewetten.de > > > > -- > > You received this message because you are subscribed to the Google > > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > > an email to golang-nuts...@googlegroups.com > > <mailto:golang-nuts...@googlegroups.com>. > > To view this discussion on the web visit > > > https://groups.google.com/d/msgid/golang-nuts/33648e9a-4011-4d02-a07b-01b506cf5cd1n%40googlegroups.com > > > < > https://groups.google.com/d/msgid/golang-nuts/33648e9a-4011-4d02-a07b-01b506cf5cd1n%40googlegroups.com?utm_medium=email&utm_source=footer > >. > > -- > Gregor Best > be...@pferdewetten.de > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/1b1c7d89-64b4-4dd0-9443-20eea73cb04bn%40googlegroups.com.