2016-08-30 14:02:57 +02:00
![moq logo ](moq-logo-small.png )
2016-08-30 14:00:43 +02:00
2016-08-29 14:25:35 +02:00
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 ).
2016-08-29 14:00:18 +02:00
2016-08-30 14:00:43 +02:00
### Usage
2016-08-29 14:00:18 +02:00
2016-08-30 14:04:56 +02:00
In a command line:
2016-08-29 14:00:18 +02:00
```
2016-08-29 14:25:35 +02:00
moq InterfaceName -out mocks_test.go
```
2016-08-30 14:04:56 +02:00
In code (for go generate):
```go
package my
//go:generate moq MyInterface -out myinterface_moq_test.go
type MyInterface interface {
Method1() error
Method2(i int)
}
```
Then run `go generate` for your package.
2016-08-30 14:00:43 +02:00
### Install
2016-08-29 14:25:35 +02:00
```
go install github.com/matryer/moq
2016-08-29 14:00:18 +02:00
```
2016-08-29 14:30:24 +02:00
2016-08-30 14:00:43 +02:00
### How to use it
2016-08-29 14:30:24 +02:00
Mocking interfaces is a nice way to write unit tests where you can easily control the behaviour of the mocked object.
2016-08-29 14:31:32 +02:00
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:
2016-08-29 14:30:24 +02:00
```go
func TestCompleteSignup(t *testing.T) {
called := false
var sentTo string
2016-08-29 14:31:32 +02:00
mockedEmailSender = & EmailSenderMock{
2016-08-29 14:30:24 +02:00
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)
}
}
2016-08-29 14:31:32 +02:00
func CompleteSignUp(to string, sender EmailSender) {
// TODO: this
}
2016-08-29 14:30:24 +02:00
```
2016-08-29 14:33:28 +02:00
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
2016-08-29 14:34:34 +02:00
* Use closured variables inside your test function to capture details about the calls to the methods
2016-08-29 14:33:28 +02:00
* Use `go:generate` to invoke the `moq` command