亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何讓 golang 測試多行輸出匹配

如何讓 golang 測試多行輸出匹配

Go
互換的青春 2023-06-05 19:49:36
我有以下生成一些字符串輸出的代碼:package formatterimport (    "bytes"    "log"    "text/template"    "github.com/foo/bar/internal/mapper")// map of template functions that enable us to identify the final item within a// collection being iterated over.var fns = template.FuncMap{    "plus1": func(x int) int {        return x + 1    },}// Dot renders our results in dot format for use with graphvizfunc Dot(results []mapper.Page) string {    dotTmpl := `digraph sitemap { {{range .}}  "{{.URL}}"    -> { {{$n := len .Anchors}}{{range  $i, $v := .Anchors}}      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}    } {{end}}}`    tmpl, err := template.New("digraph").Funcs(fns).Parse(dotTmpl)    if err != nil {        log.Fatal(err)    }    var output bytes.Buffer    if err := tmpl.Execute(&output, results); err != nil {        log.Fatal(err)    }    return output.String()}它生成如下輸出:digraph sitemap {  "http://www.example.com/"    -> {      "http://www.example.com/foo",      "http://www.example.com/bar",      "http://www.example.com/baz"    }}
查看完整描述

3 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

如果你想忽略格式,你可以使用strings.Fields.


output := strings.Fields(`digraph sitemap {

  "http://www.example.com/"

      -> {

          "http://www.example.com/foo",

          "http://www.example.com/bar",

          "http://www.example.com/baz"

  }

}`)


actual := strings.Fields(Dot(input))


if !equal(output,actual) {

    // ...

}

其中 equal 是比較兩個切片的簡單函數。


查看完整回答
反對 回復 2023-06-05
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

最簡單的解決方案是在指定預期輸出時在測試中使用相同的縮進(與您在模板中使用的相同)。


你有:


output := `digraph sitemap {

  "http://www.example.com/"

      -> {

          "http://www.example.com/foo",

          "http://www.example.com/bar",

          "http://www.example.com/baz"

  }

}`

將其更改為:


    output := `digraph sitemap {

  "http://www.example.com/"

    -> {

      "http://www.example.com/foo",

      "http://www.example.com/bar",

      "http://www.example.com/baz"

    }

}`

請注意,例如,最后一行沒有縮進。當您使用原始字符串文字時,包括縮進字符在內的每個字符都是原樣文字的一部分。


創建正確的、未縮進的原始字符串文字的步驟

畢竟,這完全是一個非編碼問題,而是編輯器自動格式化和定義原始字符串文字的問題。一種簡單的正確方法是首先編寫一個空的原始字符串文字,向其添加一個空行并清除編輯器插入的自動縮進:


    output := `

`

當你有這個時,在結束反引號之前復制粘貼正確的輸入,例如:


    output := `

digraph sitemap {

  "http://www.example.com/"

    -> {

      "http://www.example.com/foo",

      "http://www.example.com/bar",

      "http://www.example.com/baz"

    }

}`

最后一步,從原始字符串文字的第一行刪除換行符,您將獲得正確的原始字符串文字:


    output := `digraph sitemap {

  "http://www.example.com/"

    -> {

      "http://www.example.com/foo",

      "http://www.example.com/bar",

      "http://www.example.com/baz"

    }

}`

一旦你有了這個,gofmt編輯器的運行或自動格式化就不會再混亂了。


更新:


我檢查了你更新的測試結果,在你得到的結果中,第一行之后有一個空格:digraph sitemap {,第三行之后也有一個空格:-> {,但是你沒有將它們添加到你的預期輸出中。也可以將它們添加到您的預期輸出中,或者從模板中刪除這些空格!比較字符串時,它們是按字節比較的,每個字符(包括空格)都很重要。


要從模板中刪除這些額外的空格:


    dotTmpl := `digraph sitemap { {{- range .}}

  "{{.URL}}"

    -> { {{- $n := len .Anchors}}{{range  $i, $v := .Anchors}}

      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}

    } {{end}}

}`

注意使用{{-。這是為了修剪模板操作周圍的空間,這是在Go 1.6中添加的。


查看完整回答
反對 回復 2023-06-05
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

問題是有一個額外的空間。在那之后的格式化文本中{似乎是你的問題。您可以通過將格式字符串更改為此來修復它


`digraph sitemap {{{range .}}

  "{{.URL}}"

    -> {{{$n := len .Anchors}}{{range  $i, $v := .Anchors}}

      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}

    }{{end}}

}`


查看完整回答
反對 回復 2023-06-05
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號