# moq Interface mocking tool for go generate. By [Mat Ryer](https://twitter.com/matryer) and [David Hernandez](https://github.com/dahernan), with ideas lovingly stolen from [Ernesto Jimenez](https://github.com/ernesto-jimenez). ## Usage ``` moq InterfaceName -out mocks_test.go ``` ## Install ``` go install github.com/matryer/moq ``` ## How to use it Mocking interfaces is a nice way to write unit tests where you can easily control the behaviour of the mocked object. Moq creates a struct that has a function field for each method, which you can declare in your test code. This this example, Moq generated the `EmailSenderMock` type: ```go func TestCompleteSignup(t *testing.T) { called := false var sentTo string mockedEmailSender = &EmailSenderMock{ SendFunc: func(to, subject, body string) error { called = true sentTo = to return nil }, } CompleteSignUp("me@email.com", mockedEmailSender) if called == false { t.Error("Sender.Send expected") } if sentTo != "me@email.com" { t.Errorf("unexpected recipient: %s", sentTo) } } func CompleteSignUp(to string, sender EmailSender) { // TODO: this } ``` The mocked structure implements the interface, where each method calls the associated function field. ## Tips * Keep mocked logic inside the test that is using it * Only mock the fields you need - it will panic if a nil function gets called * Use closured variables inside your test function to capture details about the calls to the methods * Use `go:generate` to invoke the `moq` command