Asynchronous 流处理异步测试
我对Go很陌生,所以我可能对Go的异步/流处理有一些基本的误解,但接下来 我正在尝试使用我编写的处理流的函数编写一些测试 处理端从文件中读入以换行符分隔的文本,直到遇到一个特殊的分隔符行,并尝试将文本解析为JSON。代码如下所示:Asynchronous 流处理异步测试,asynchronous,stream,go,ginkgo,Asynchronous,Stream,Go,Ginkgo,我对Go很陌生,所以我可能对Go的异步/流处理有一些基本的误解,但接下来 我正在尝试使用我编写的处理流的函数编写一些测试 处理端从文件中读入以换行符分隔的文本,直到遇到一个特殊的分隔符行,并尝试将文本解析为JSON。代码如下所示: func ParseConfig(inStream *os.File) (Config, error){ var header string var stdin = bufio.NewScanner(inStream) for stdin.Scan()
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()函数侦听字符串中的数据之前,我正在流中发送字符串?但我不完全清楚如何重构它,以使用正确的go例程,首先侦听数据,然后发送数据
我看到的一些潜在解决方案是围绕“通道”(我不熟悉)的使用而来的,但我担心这一个可能不值得进行重大重构来引入一个全新的并发范式
谢谢 不确定我是否理解正确,但您的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)
}
你的例子离编译还很远。请提供至少可编译的示例。你的io.Writer“流”在哪里(你将其传递给io.WriteString)?完美!非常感谢你抽出时间。