Тестирование аргументов CLI на ходу - PullRequest
0 голосов
/ 24 октября 2019

Я хочу протестировать некоторые подпрограммы CLI в go, которые выполняются исключительно в функции main (), это просто упражнения, которые я выполняю, но я хочу тестировать их! Так, например, как я могу передать аргументы для проверки таблицы этого короля алгоритма?

package main


import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

func main() {
    var f *os.File
    f = os.Stdin
    defer f.Close()

    scanner := bufio.NewScanner(f)

    for scanner.Scan() {
        if scanner.Text() == "STOP" || scanner.Text() == "stop" {
            break
        }

        n, err := strconv.ParseInt(scanner.Text(), 10, 64)

        if err == nil {
            fmt.Printf("Number formatted: %d\n", n)
        } else {
            fmt.Println(err.Error())
        }
    }
}

Я поместил код на игровую площадку тоже для лучшей помощи! https://play.golang.org/p/JgrQ2yFogNs

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вам необходимо создать функцию, которая будет вводить и выводить каналы как параметры. Следует читать и писать в эти параметры. Ниже приведен пример:

main.go

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strconv"
)

func main() {
    var f *os.File
    f = os.Stdin
    defer f.Close()
    run (os.Stdin, f)
}

func run(in io.Reader, out io.Writer) {
    scanner := bufio.NewScanner(in)

    for scanner.Scan() {
        if scanner.Text() == "STOP" || scanner.Text() == "stop" {
            break
        }

        n, err := strconv.ParseInt(scanner.Text(), 10, 64)

        if err == nil {
            fmt.Printf("Number formatted: %d\n", n)
        } else {
            fmt.Println(err.Error())
        }
    }
}

main_test.go

package main

import (
    "bytes"
    "fmt"
    "testing"
)
func TestRun(t *testing.T){
    var command, result bytes.Buffer
    fmt.Fprintf(&command, "10\n")
    fmt.Fprintf(&command, "stop\n")
    run(&command, &result)
    got := result.String()
    //test for contents of "got"
    fmt.Println(got)
}

Теперь вы можете запустить следующую команду в командной строке.

go test
0 голосов
/ 24 октября 2019

Строго говоря, вам не нужно использовать Go для этого. Когда я смотрю на написание инструмента CLI, я вырываюсь из main как можно скорее с функциями и строю модульное тестирование их обычным способом.

Чтобы убедиться, что все аргументы и файл CLIСистемные ошибки правильно подключены. Я использовал https://github.com/bats-core/bats-core для запуска команды и проверки полностью встроенного инструмента.

Пример того, как я это сделал, вы можете увидеть на https://github.com/dnnrly/abbreviate

Возможно, не тот ответ, который вы ищете, но он хорошо работает для меня.

...