jarcoal / httpmock

HTTP mocking for Golang
http://godoc.org/github.com/jarcoal/httpmock
MIT License
1.93k stars 103 forks source link

No responder found when mocking with Cobra.Execute() #106

Closed piyushsingariya closed 3 years ago

piyushsingariya commented 3 years ago

Hi, I am trying to mock requests that are being made by some cobra commands in our CLI. But I end up encountering this error Get \"http://localhost:9081/api/user/performance/profiles?page_size=25&search=test\": no responder found

Here is the implementation:-

func TestPerfView(t *testing.T) {
    // setup current context
    utils.SetupContextEnv(t)

    // initialize mock server for handling requests
    utils.StartMockery(t)

    // create a test helper
    testContext := utils.NewTestHelper(t)

    // get current directory
    _, filename, _, ok := runtime.Caller(0)
    if !ok {
        t.Fatal("problems recovering caller information")
    }
    currDir := filepath.Dir(filename)
    fixturesDir := filepath.Join(currDir, "fixtures")

    // test scenrios for fetching data
    tests := []struct {
        Name             string
        Args             []string
        View             string
        ExpectedResponse string
        Fixture          string
        URL              string
        Token            string
        ExpectError      bool
    }{
        {
            Name:             "View Profiles",
            Args:             []string{"view", "test", "--token", filepath.Join(fixturesDir, "token.golden")},
            View:             "Profiles",
            ExpectedResponse: "view.profile.output.golden",
            Fixture:          "view.profile.api.response.golden",
            URL:              testContext.BaseURL + "/api/user/performance/profiles?search=test",
            Token:            filepath.Join(fixturesDir, "token.golden"),
            ExpectError:      false,
        },
    }

    // Run tests
    for _, tt := range tests {
        t.Run(tt.Name, func(t *testing.T) {
            // View api response from golden files
            apiResponse := utils.NewGoldenFile(t, tt.Fixture, fixturesDir).Load()

            // set token
            tokenPath = tt.Token

            // mock response
            httpmock.RegisterResponder("GET", tt.URL,
                httpmock.NewStringResponder(200, apiResponse))

            // Expected response
            testdataDir := filepath.Join(currDir, "testdata")
            golden := utils.NewGoldenFile(t, tt.ExpectedResponse, testdataDir)

            // Grab outputs from console.
            var buf bytes.Buffer
            log.SetOutput(&buf)
            utils.SetupLogrusFormatter()

            PerfCmd.SetArgs(tt.Args)
            PerfCmd.SetOutput(&buf)
            err := PerfCmd.Execute()
            if err != nil {
                // if we're supposed to get an error
                if tt.ExpectError {
                    // write it in file
                    if *update {
                        golden.Write(err.Error())
                    }
                    expectedResponse := golden.Load()

                    utils.Equals(t, expectedResponse, err)
                    return
                } else {
                    t.Error(err)
                }
            }

            // response being printed in console
            actualResponse := buf.String()

            // write it in file
            if *update {
                golden.Write(actualResponse)
            }
            expectedResponse := golden.Load()

            utils.Equals(t, expectedResponse, actualResponse)
        })
    }

    // stop mock server
    utils.StopMockery(t)
}
maxatome commented 3 years ago

Hello, If I understand well, you register a responder for /api/user/performance/profiles?search=test so not for /api/user/performance/profiles?page_size=25&search=test as expected. So it is normal no responder is found. Try to register /api/user/performance/profiles instead, without any query param.

piyushsingariya commented 3 years ago

thanks, @maxatome for the assistance. I figured it out a bit later how exactly this thing works!