Go to file
2016-08-29 15:27:09 +01:00
example improved output 2016-08-29 13:09:34 +01:00
package/moq added comments 2016-08-29 15:27:09 +01:00
.gitignore Initial commit 2016-08-29 11:00:17 +01:00
LICENSE Initial commit 2016-08-29 11:00:17 +01:00
main.go early commit for moq command 2016-08-29 13:00:18 +01:00
README.md added another tip 2016-08-29 13:34:34 +01:00

moq

Interface mocking tool for go generate.

By Mat Ryer and David Hernandez, with ideas lovingly stolen from 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:

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