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