Great tips. Thank you.

On Wednesday, November 15, 2017 at 12:46:39 PM UTC+8, M P r a d e s wrote:
>
> Since functions are values you can just do that:
>
>
> var NewExternalService func()Service = pkg.NewExternalService
>
>
> and then mock NewExternalService 
>
> or explicitely inject dependencies in your http.HandlerFunc
>
> func(Service) http.HandlerFunc{
>   return func(w http.ResponseWriter, r *http.Request){
>       // use Service here
>   }
> }
>
>
>
> or use http.Handler
>
> type HandleLogin struct {
>     Service
> }
>
>
> func(h handleLogin)ServeHTTP(w http.ResponseWriter,r *http.Request){
>      h.Service.CallThis(r)
> }
>
> You can only write unit tests if you write testable code at first place.
>
> Le mercredi 15 novembre 2017 03:28:28 UTC+1, Glen Huang a écrit :
>>
>> I find that to be able to unit test things in golang, I need to 
>> restructure them in an uncomfortable way in order to be able to mock their 
>> dependencies.
>>
>> For example, say I want to test this simple http handler:
>>
>> func handleLogIn(w http.ResponseWriter, r *http.Request) {
>> svc := pkg.NewExternalService()
>> value1 := parseValue1(r)
>> svc.CallThis(value1)
>> value2 := parseValue2(r)
>> svc.CallThat(value2)
>> }
>>
>> I want to mock pkg.NewExternalService, then use httptest to make sure 
>> given a http.Request, svc will be called with the correctly values.
>>
>> Right now, the solution I can come up with:
>>
>> 1. create a closure to create the service instead:
>>
>> var newExternalService = func () Service {
>> return pkg.NewExternalService()
>> }
>>
>> 2. override it in test:
>>
>> newExternalService = func () Service {
>> return &MockService{}
>> }
>>
>> Notice how I'm forced to use a closure instead of a function declaration.
>>
>> And then I have to turn Service into an interface so I can return a mock 
>> in test. But that's not the end of it. If I ever need to access a field of 
>> Service, I'm screwed, because interfaces can't contain fields. So I also 
>> have to restructure Service to expose fields as methods.
>>
>> I feel catering to the ability to be tested has too big an impact on my 
>> original code, and if I have no control over the design for the original 
>> Service, it seems it will be very difficult to test to say the least.
>>
>> I wonder if there is a better solution?
>>
>> Regards,
>> Glen
>>
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to