2017-08-01 17 views
0

httpリクエストの単体テストを書くことを始めたばかりですが、私はいくつかのブログを見ましたが、私はイチョウを使ってテストを書く方法を理解していませんでした。 Ginkgoを使って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を経て、それはまさに私のコードが必要ですが、それはテストパッケージを使用し、私はこの使用してイチョウを実装したいのかを説明します。

答えて

0

ghttpで戦利品を取る: http://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

これは '127.0.0.1:45023/path/to/somepage/VOLUME:URLの最初のパスセグメントにコロンを含めることはできません 'というエラーをスローします.'というエラーが発生します。 –

+0

ああ、私の悪い。あなたは "http://"を 'server.Addr()'にふりかける必要があります –

関連する問題