mercredi 28 janvier 2015

Testing 3rd party package in golang

I'm new to golang and trying to write a simple learning app using the facebook package from http://ift.tt/15WS2zh.


I was able to get the package and connect to facebook and hit the facebook API. This is great but testing is my concern.


At first I was simply calling the method and creating a facebook object inside of it. Then after some research I tried passing in the facebook method I wanted to mock. Realizing there were multiple methods I needed, I am convinced that passing an interface is the right way to go.


So I tried creating interfaces that the package would implement.



type IFbApp interface {
ExchangeToken(string) (string, int, error)
Session(string) IFbSession
}

type MyFbApp struct{}

func (myFbApp *MyFbApp) ExchangeToken(token string) (string, int, error) {
return myFbApp.ExchangeToken(token)
}

func (myFbApp *MyFbApp) Session(token string) IFbSession {
return myFbApp.Session(token)
}

type IFbSession interface {
User() (string, error)
Get(string, map[string]interface{}) (map[string]interface{}, error)
}

type MyFbSession struct{}
func (myFbSession *MyFbSession) User() (string, error) {
return myFbSession.User()
}

func (myFbSession *MyFbSession) Get(path string, params map[string]string) (map[string]string, error) {
return myFbSession.Get(path, params)
}

func Test() {
Facebook(fb.New("appId", "appSecret")); // fb calls package
}

func Facebook(fbI IFbApp) {
fbI.ExchangeToken("sometokenhere");
}


I cannot compile this code since I get an error



cannot use facebook.New("appId", "appSecret") (type *facebook.App) as type IFbApp in argument to Facebook:
*facebook.App does not implement IFbApp (wrong type for Session method)
have Session(string) *facebook.Session
want Session(string) IFbSession


Switching IFbSession to *facebook.Session would make it compile of course but then I need to mock methods from the Session struct as well.


Anyone have any tips?


Thanks.


Aucun commentaire:

Enregistrer un commentaire