2013-07-03 10 views
6

kullanıcı girişi karşı testleri yazmak için? Örneğin, işlev girişinin STDIN'den "4 5 \ n" ve "1 2 3 4 \ n" kabul edip n == 5 ve array == [1, 2, 3, 'i döndüreceğini nasıl test edebilirim? 4].nasıl fmt.Scan/SCANF/Scanln gelen kullanıcı girişi karşı test olacağını nasıl Go

package main 

import (
    "fmt" 
) 

// input gets an array from the user. 
func input() (m int, array []int) { 
    fmt.Print("Enter the size of the array, n, and the difference, m: ") 
    var n int 
    _, err := fmt.Scanf("%d %d", &n, &m) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Print("Enter the array as a space seperated string: ") 
    array = make([]int, n) 
    for i := 0; i < n; i++ { 
     _, _ = fmt.Scan(&array[i]) 
    } 

    return m, array 
} 

func main() { 
    m, array := input() 
    fmt.Println(m, array) 
} 

cevap

10

İşte prensibini göstermek için çok kaba bir taslak.

program.go

package main 

import (
    "fmt" 
    "os" 
) 

// input gets an array from the user. 
func input(in *os.File) (m int, array []int) { 
    if in == nil { 
     in = os.Stdin 
    } 

    fmt.Print("Enter the size of the array, n, and the difference, m: ") 
    var n int 
    _, err := fmt.Fscanf(in, "%d %d", &n, &m) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Print("Enter the array as a space seperated string: ") 
    array = make([]int, n) 
    for i := 0; i < n; i++ { 
     _, _ = fmt.Fscan(in, &array[i]) 
    } 

    return m, array 
} 

func main() { 
    m, array := input(nil) 
    fmt.Println(m, array) 
} 

program_test.go

package main 

import (
    "fmt" 
    "io" 
    "io/ioutil" 
    "os" 
    "testing" 
) 

func TestInput(t *testing.T) { 
    var (
     n, m int 
     array []int 
    ) 

    in, err := ioutil.TempFile("", "") 
    if err != nil { 
     t.Fatal(err) 
    } 
    defer in.Close() 

    _, err = io.WriteString(in, "4 5\n"+"1 2 3 4\n") 
    if err != nil { 
     t.Fatal(err) 
    } 

    _, err = in.Seek(0, os.SEEK_SET) 
    if err != nil { 
     t.Fatal(err) 
    } 

    n, array = input(in) 
    if n != 5 || fmt.Sprintf("%v", array) != fmt.Sprintf("%v", []int{1, 2, 3, 4}) { 
     t.Error("unexpected results:", n, m, array) 
    } 
} 

Çıktı: bazı formda test edilebilir olacak şekilde

$ go test 
ok  command-line-arguments 0.010s 
+0

Teşekkürler, hataları düzeltdim ve yayınınıza bir düzenleme gönderdim. – dmikalova

-5

Yapamazsınız. En azından o kadar kolay değil, öyle ki, bu çabaya değer olurdu.

+2

O zaman nasıl kodunu değiştirmek olabilir? – dmikalova

+0

Bunu yapamazsınız. Temel olarak fmt.Scanf'a karşı (en azından kodun resonable miktarı ile) bir birim testi yazamazsınız. Kodunuzu aşağıdaki gibi bölmelisiniz: 1) Girişi alın. 2) Girişi işleyin. 2 için bir test yazın. Yukarıdaki örnek, 1) bir os.File (os.Stdin olabilir) ve 2) üzerinde çalışan bir input() fonksiyonu üzerinde çalışmaktadır. Ancak not: Peter'ın cevabı zekice bir şeydir ama * NOT * fmt.Fscanf tarafından girdinin girildiğinden fmt.Scanf'ın çalıştığını kontrol edin. (Sadece bir sarıcı olduğunu biliyorum). Hala bekliyorum: Kullanıcı girişine karşı birim testleri yazamazsınız. – Volker

+0

Söylediklerinize uyun, ama Peter'ın çözümü, Go'nun kendisinin beklendiği gibi çalıştığını düşündüğünüz sürece işlevsel olarak eşdeğerdir. peterSO'nun çözümü de benim sorunumu tam olarak çözüyor ve herhangi bir tutarsızlık, yalnızca sorumu düzgün bir şekilde dile getirememden kaynaklanıyor. – dmikalova