गो

2013-07-03 10 views
6

में उपयोगकर्ता इनपुट के खिलाफ परीक्षण कैसे लिखें fmt.Scan/scanf/scanln से उपयोगकर्ता इनपुट के खिलाफ मैं कैसे परीक्षण करूं?गो

उदाहरण के लिए मैं कैसे परीक्षण कर सकता हूं कि फ़ंक्शन इनपुट STDIN से "4 5 \ n" और "1 2 3 4 \ n" स्वीकार करेगा और n == 5 और सरणी == [1, 2, 3, 4]।

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) 
} 

उत्तर

10

सिद्धांत को चित्रित करने के लिए यहां एक बहुत ही कठिन ड्राफ्ट है।

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) 
    } 
} 

आउटपुट:

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

धन्यवाद, मैंने बग तय की है और आपकी पोस्ट में एक संपादन सबमिट किया है। – dmikalova

-5

आप नहीं कर सकते। कम से कम इतना आसान नहीं, इस तरह, यह प्रयास के लायक होगा।

+2

तो कैसे मैं अपने कोड इतना है कि यह किसी न किसी रूप में परीक्षण योग्य होगा बदल सकता है? – dmikalova

+0

आप ऐसा नहीं कर सकते। असल में आप (कम से कम कोड की रंजनीय राशि के साथ नहीं) कर सकते हैं fmt.Scanf के खिलाफ एक यूनिट परीक्षण लिखें। आपको अपना कोड इस प्रकार विभाजित करना चाहिए: 1) इनपुट प्राप्त करें। 2) इनपुट प्रक्रिया। 2 के लिए एक टेस्ट लिखें। उपर्युक्त उदाहरण इस के साथ विभाजित है 1) एक ओएस पर काम कर रहा है (जो ओएस.Stdin हो सकता है) और 2) इस पर एक इनपुट() फ़ंक्शन चल रहा है। लेकिन ध्यान दें: पीटर का जवाब एक चालाक है लेकिन * f *t * स्कैनफ की जांच नहीं करता है क्योंकि इनपुट fmt.Fscanf द्वारा पढ़ा जाता है। (मुझे पता है कि यह सिर्फ एक आवरण है)। मैं अभी भी पकड़ता हूं: आप उपयोगकर्ता इनपुट के खिलाफ यूनिट परीक्षण नहीं लिख सकते हैं। – Volker

+0

मैं जो कह रहा हूं उसे प्राप्त करता हूं, लेकिन पीटर एसओ का समाधान कार्यात्मक रूप से समतुल्य है जब तक आप मानते हैं कि गो स्वयं अपेक्षा के अनुसार काम करता है। पीटर एसओ का समाधान भी मेरी समस्या को हल करता है, और कोई विसंगति पूरी तरह से मेरे प्रश्न को सही तरीके से शब्द देने में असमर्थता से है। – dmikalova

 संबंधित मुद्दे