cweill / gotests

Automatically generate Go test boilerplate from your source code.
Apache License 2.0
4.93k stars 346 forks source link

Support for mocks in tests #137

Open chatrasen opened 4 years ago

chatrasen commented 4 years ago

Majority of the functions involve calls to functions from external packages which need to be mocked. Adding support for mocks can take gotests to the next level I believe.

e.g. An example function and its generated test can look something like this (pseudocode)

CODE

package A

import B

func fA(in) out{
    ...
    resp := B.fB(p1, p2)
    ...
}

TEST

package A

import bmock

func TestfA(t *testing.T) {
    type mockB struct {
        resp   // mock resp of B.fB
        times  // number of times B.fB will be called
    }

    testCases := []struct {
        name
        args
        mockB 
        want
    } { // add testcases }

    for _, tc := range testCases {
        t.Run(tc.name, func(t *testing.T) {
            gmc := gomock.NewController(t)
            defer gmc.Finish()

            bStub := bmock.NewMockService(t) // just an example, this is debatable
            bstub.Expect().fB(gomock.Any(), gomock.Any()). // 2 params so 2 gomock.Any()
                    Times(tc.mockB.times).
                    Return(tc.mockB.resp)

            ...... // existing logic follows
        })
    }
}

I would first like to ask whether you have already thought about the feasibility of this idea. If you feel this is possible, I would love to work on this enhancement.

cweill commented 3 years ago

Hi @chatrasen, while personally I'm not the biggest fan of mocks (I prefer fakes and stubs), I understand that many Go programmers would love to have this feature. I also see that goland/mock is very popular.

I will approve a PR introducing this feature, as long as it is disabled by default, and enabled by a flag like --automock='mock', so that we can extend this to use other mocking libraries in the future.

johan-lejdung commented 3 years ago

I'm using mockery and are very interested in trying this package out! It would be amazing to get some generated code with support for mockery mocks as well 🙏

Following with great interest