[PATCH] Omit sync package while mocking empty interface

when just an empty interface is has beeing mocked, the import of the sync package caused an error. In production it isn't important, because mocking empty interfaces might be stupid, but while writing tests it might happen, that you create an interface, which is beeing filled later on.
This commit is contained in:
Frederik Vosberg 2017-07-27 21:08:06 +02:00
parent df933a7865
commit ede55fbbe7
3 changed files with 24 additions and 3 deletions

View File

@ -69,6 +69,7 @@ func (m *Mocker) Mock(w io.Writer, name ...string) error {
PackageName: m.pkgName,
Imports: moqImports,
}
mocksMethods := false
for _, pkg := range m.pkgs {
i := 0
files := make([]*ast.File, len(pkg.Files))
@ -94,6 +95,7 @@ func (m *Mocker) Mock(w io.Writer, name ...string) error {
InterfaceName: n,
}
for i := 0; i < iiface.NumMethods(); i++ {
mocksMethods = true
meth := iiface.Method(i)
sig := meth.Type().(*types.Signature)
method := &method{
@ -106,6 +108,9 @@ func (m *Mocker) Mock(w io.Writer, name ...string) error {
doc.Objects = append(doc.Objects, obj)
}
}
if mocksMethods {
doc.Imports = append(doc.Imports, "sync")
}
for pkgToImport := range m.imports {
doc.Imports = append(doc.Imports, pkgToImport)
}

View File

@ -214,3 +214,19 @@ func TestDotImports(t *testing.T) {
t.Error("contains invalid dot import")
}
}
func TestEmptyInterface(t *testing.T) {
m, err := New("testpackages/emptyinterface", "")
if err != nil {
t.Fatalf("moq.New: %s", err)
}
var buf bytes.Buffer
err = m.Mock(&buf, "Empty")
if err != nil {
t.Errorf("mock error: %s", err)
}
s := buf.String()
if strings.Contains(s, `"sync"`) {
t.Error("contains sync import, although this package isn't used")
}
}

View File

@ -1,7 +1,7 @@
package moq
// moqImports are the imports all moq files get.
var moqImports = []string{"sync"}
var moqImports = []string{}
// moqTemplate is the template for mocked code.
var moqTemplate = `// Code generated by moq; DO NOT EDIT
@ -35,7 +35,7 @@ var (
//
// // TODO: use mocked{{.InterfaceName}} in code that requires {{.InterfaceName}}
// // and then make assertions.
//
//
// }
type {{.InterfaceName}}Mock struct {
{{- range .Methods }}
@ -43,7 +43,7 @@ type {{.InterfaceName}}Mock struct {
{{.Name}}Func func({{ .Arglist }}) {{.ReturnArglist}}
{{ end }}
// calls tracks calls to the methods.
calls struct {
calls struct {
{{- range .Methods }}
// {{ .Name }} holds details about calls to the {{.Name}} method.
{{ .Name }} []struct {