如何使用银杏对HTTP请求进行单元测试?

如何使用银杏对HTTP请求进行单元测试?

问题描述:

我刚开始学习为http请求编写单元测试,我经历了几个博客,但我不明白如何使用银杏编写测试。如何使用银杏对HTTP请求进行单元测试?

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去了,它到底解释了什么是我的代码需要,但它使用的测试包,我想实现这个用银杏。

乘坐战利品在ghttphttp://onsi.github.io/gomega/#ghttp-testing-http-clients https://godoc.org/github.com/onsi/gomega/ghttp

草图看起来像:

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,因此您需要创建并发回自定义错误。

+0

谢谢@Onsi,这段代码有很多问题,稍后会解决。 –

+0

这个抛出'parse 127.0.0.1:45023/path/to/somepage/VOLUME:URL中的第一个路径段不能包含冒号'错误,有什么可能。 –

+0

啊对,我的坏。你需要假装“http://”到'server.Addr()' –