2014-06-24 104 views
0

我很新去,所以我可能誤解有關圍棋的異步/流處理基礎性的東西,但在這裏不用...異步測試使用流處理

我想寫使用ginkgo一些測試我寫了一個處理流的函數。

處理端從文件中讀取換行符分隔的文本,直到它遇到特殊的分隔符行,此時它嘗試將文本解析爲JSON。代碼如下所示:

func ParseConfig(inStream *os.File) (Config, error){ 
    var header string 

    var stdin = bufio.NewScanner(inStream) 
    for stdin.Scan() { 
    line := stdin.Text() 

    if line == "|||" { 
     break; 
    } 

    header += line 
    } 

    // parse JSON here and return 
} 

我的測試看起來像這樣

Describe("ParseConfig()", func() { 
    It("should pass for a valid header", func(){ 
    _, err := io.WriteString(stream, "{\"Key\": \"key\", \"File\": \"file\"}\n|||\n") 
    Expect(err).NotTo(HaveOccurred()) 

    conf, err := parser.ParseConfig(stream) 
    Expect(err).NotTo(HaveOccurred()) 

    Expect(conf.Key).To(Equal("key")) 
    }) 
}) 

不幸的是,這會產生一個JSON解析錯誤,因爲它試圖解析一個空字符串。我假設我的問題是,我已經告訴ParseConfig()函數監聽該字符串的數據之前,我正在發送字符串的流?但我並不完全清楚我可以如何重構這個使用正確的去例程來首先偵聽數據然後發送它。我看到的一些潛在的解決方案是圍繞着使用「渠道」(我不熟悉),但我擔心這個需求可能不值得一個主要的重構來引入一個全新的併發範例。

謝謝!

+0

你舉的例子是由編譯很遠。請提供一個至少編譯的例子。你的'流'io.Writer(你傳遞給io.WriteString)在哪裏? – creack

回答

2

不知道我的理解是否正確,但是您的ParseConfig應該採用io.Reader而不是*os.File。這樣你可以直接測試它,而不必擔心併發性。

文件t_test.go:

package main 

import (
     "strings" 
     "testing" 

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

var _ = ginkgo.Describe("ParseConfig()", func() { 
     ginkgo.It("should pass for a valid header", func() { 
       // really don't know what you were doing with your 'stream' variable 
       // This is a test, you should forge a test scenario and pass it to your config function 
       stream := strings.NewReader(`{"Key": "key", "File": "file"}` + "\n|||\n") 

       conf, err := ParseConfig(stream) 
       gomega.Expect(err).NotTo(gomega.HaveOccurred()) 
       gomega.Expect(conf.Key).To(gomega.Equal("key")) 
     }) 
}) 

func TestParseConfig(t *testing.T) { 
     ginkgo.RunSpecs(t, "Parse Config") 
} 

文件main.go

package main 

import (
     "bufio" 
     "encoding/json" 
     "io" 
     "log" 
     "os" 
) 

type Config struct { 
     Key string 
     File string 
} 

func ParseConfig(inStream io.Reader) (*Config, error) { 
     var header string 

     var stdin = bufio.NewScanner(inStream) 
     for stdin.Scan() { 
       line := stdin.Text() 

       if line == "|||" { 
         break 
       } 
       header += line 
     } 

     c := &Config{} 

     // parse JSON here and return 
     if err := json.Unmarshal([]byte(header), c); err != nil { 
       return nil, err 
     } 
     return c, nil 
} 

func main() { 
     f, err := os.Open("config.json") 
     if err != nil { 
       log.Fatal(err) 
     } 
     ParseConfig(f) 
} 
+0

完美!非常感謝花時間。 –