首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ginkgo对HTTP请求进行单元测试?

如何使用Ginkgo对HTTP请求进行单元测试?
EN

Stack Overflow用户
提问于 2017-08-01 18:04:18
回答 1查看 3.1K关注 0票数 2

我刚刚开始学习为http请求编写单元测试,我浏览了几个博客,但我不知道如何使用Ginkgo来编写测试。

代码语言:javascript
复制
func getVolDetails(volName string, obj interface{}) error {
    addr := os.Getenv("SOME_ADDR")
    if addr == "" {
        err := errors.New("SOME_ADDR environment variable not set")
        fmt.Println(err)
        return err
    }
    url := addr + "/path/to/somepage/" + volName
    client := &http.Client{
        Timeout: timeout,
    }
    resp, err := client.Get(url)
    if resp != nil {
        if resp.StatusCode == 500 {
            fmt.Printf("VSM %s not found\n", volName)
            return err
        } else if resp.StatusCode == 503 {
            fmt.Println("server not reachable")
            return err
        }
    } else {
        fmt.Println("server not reachable")
        return err
    }

    if err != nil {
        fmt.Println(err)
        return err
    }
    defer resp.Body.Close()

    return json.NewDecoder(resp.Body).Decode(obj)
}

// GetVolAnnotations gets annotations of volume
func GetVolAnnotations(volName string) (*Annotations, error) {
    var volume Volume
    var annotations Annotations
    err := getVolDetails(volName, &volume)
    if err != nil || volume.Metadata.Annotations == nil {
        if volume.Status.Reason == "pending" {
            fmt.Println("VSM status Unknown to server")
        }
        return nil, err
    }
    // Skipped some part,not required
}

我浏览了这个blog,它准确地解释了我的代码需要什么,但它使用的是测试包,我想使用ginkgo实现它。

EN

回答 1

Stack Overflow用户

发布于 2017-08-04 04:21:14

看看ghttp包:http://onsi.github.io/gomega/#ghttp-testing-http-clients https://godoc.org/github.com/onsi/gomega/ghttp

粗略的草图可能如下所示:

代码语言:javascript
复制
import (
    "os"

    . "github.com/onsi/ginkgo/tmp"
    "github.com/onsi/gomega/ghttp"

    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)

var _ = Describe("GetVolAnnotations", func() {
    var server *ghttp.Server
    var returnedVolume Volume
    var statusCode int

    BeforeEach(func() {
        server = ghttp.NewServer()
        os.Setenv("SOME_ADDR", server.Addr())

        server.AppendHandlers(
            ghttp.CombineHandlers(
                ghttp.VerifyRequest("GET", "/path/to/somepage/VOLUME"),
                ghttp.RespondWithJSONEncodedPtr(&statusCode, &returnedVolume),
            )
        )
    })

    AfterEach(func() {
        server.Close()
    })

    Context("When when the server returns a volume", func() {
        BeforeEach(func() {
            returnedVolume = Volume{
                Metadata: Metadata{
                    Annotations: []string{"foo"}
                }
            }
            statusCode = 200
        })

        It("returns the annotations associated with the volume", func() {
            Expect(GetVolAnnotations("VOLUME")).To(Equal([]string{"foo"}))
        })
    })

    Context("when the server returns 500", func() {
        BeforEach(func() {
            statusCode = 500
        })

        It("errors", func() {
            value, err := GetVolAnnotations("VOLUME")
            Expect(value).To(BeNil())
            Expect(err).To(HaveOccurred())
        })
    })

    Context("when the server returns 503", func() {
        BeforEach(func() {
            statusCode = 503
        })

        It("errors", func() {
            value, err := GetVolAnnotations("VOLUME")
            Expect(value).To(BeNil())
            Expect(err).To(HaveOccurred())
        })
    })
})

不过,我认为您的代码存在一些问题。如果你得到一个500或503状态码,你不一定有一个err,所以你需要从你的服务器创建并发回一个自定义的错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45434849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档