2015-02-12 17 views
-1

我嘗試通過在命令提示符下的測試套件通(HELLO-world_test.go):未能作出測試套件通golang「的sayHello()作爲值」

package helloworld 

import "testing" 

func TestHelloWorld(t *testing.T) { 
    output := sayHello() 
    if "Hello, World!" != output { 
     t.Fatalf("output: %s\nexpected: Hello,World!", output) 
    } 
} 

我的代碼如下(helloworld.go):

package helloworld 

import "fmt" 

func sayHello() { 
    fmt.Println("Hello, World!") 

} 

,並通過命令提示錯誤代碼是:

C:\Users\Troy\exercism\go\hello-world\go test -v 
# _/C_/Users/Troy/exercism/go/hello-world 
.\hello-world_test.go:6: sayHello() used as value 
FAIL _/C_/Users/Troy/exercism/go/hello-world [build failed] 
+4

'sayHello'不會返回任何東西,但您將其輸出捕獲到'output'。 – akonsu 2015-02-12 01:24:17

+3

您需要捕獲sdout並將捕獲的輸出與「Hello,World!」進行比較。有關如何捕獲stdout的示例,請參閱[示例運行器](https://golang.org/src/testing/example.go#L44)。 – 2015-02-12 01:35:31

回答

-1

我已經開發(有關此類ö f單元測試)godbg.Out() and godbg.Err(),兩個io.Writer,其默認爲os.Stdoutos.Stderr。這意味着我不再使用fmt.Println("Hello, World!")

相反,我做的事:

fmt.Fprintln(Out(), "Hello, World!") 

,讓我,當我想單元測試(有單元測試自己的輸出充滿fmt.Println結果,而不是)輸出,改變默認io.Writer與專用於該測試的,使用pdbg.SetBuffer()函數。

這樣,my test becomes

Convey("Test custom buffer reset on global pdbg", func() { 
     SetBuffers(nil) 
     fmt.Fprint(Out(), "test content") 
     So(OutString(), ShouldEqual, `test content`) 
     fmt.Fprint(Err(), "err1 cerr") 
     So(ErrString(), ShouldEqual, `err1 cerr`) 
     ResetIOs() 
     fmt.Fprint(Out(), "test2 content2") 
     So(OutString(), ShouldEqual, `test2 content2`) 
     fmt.Fprint(Err(), "err2 cerr2") 
     So(ErrString(), ShouldEqual, `err2 cerr2`) 
    }) 

我現在可以在標準輸出或進行更換(僅限單元測試期間)標準錯誤測試輸出用我自己的那些作家。

注:

  • 我在這裏使用的​​單元測試框架。
  • 設計仍在進行中。稍後我可能會將這些編寫器函數移入它們自己的包中。
+0

你知道,'os.Stdout'和'os.Stderr'是你可以用自己的讀者和作者覆蓋的變量嗎? – fuz 2015-02-12 15:16:53

+0

@FUZxxl我首先最好不要修改它們,但我當然會簡化當前的設計。 – VonC 2015-02-12 15:36:59

+0

我的意思是,如果你想要做的是觀察通過'Stdout'發生了什麼並且實際發生了什麼並不重要,這聽起來像是一個很好的方法。 – fuz 2015-02-12 15:43:37

-2

顯然,所有我不得不這樣做,以獲得原始測試套件,通過爲定義sayHello()功能作爲一個字符串,並返回其值"Hello, World!。另外,我做線3和6條的評論,因爲它們不直接影響代碼:

package helloworld 

//import "fmt" 

func sayHello() string { 
    //fmt.Println("Hello, World!") 
    return "Hello, World!" 
} 

做評論使代碼的「俗氣」的作風?

相關問題