Отказ от ответственности: Желаю вам веселого XMas, и я надеюсь, что мой вопрос не беспокоит вас!как бороться с пакетом библиотеки «fmt» golang для тестирования CLI
sample.go:
package main
import(
"fmt"
"os"
)
type sample struct {
value int64
}
func (s sample) useful() {
if s.value == 0 {
fmt.Println("Error: something is wrong!")
os.Exit(1)
} else {
fmt.Println("May the force be with you!")
}
}
func main() {
s := sample{42}
s.useful()
s.value = 0
s.useful()
}
// output:
// May the force be with you!
// Error: something is wrong!
// exit status 1
Я сделал много исследований о том, как использовать интерфейсы в тестировании golang. Но до сих пор я не мог полностью обернуть свою голову. По крайней мере, я не вижу, как интерфейсы помогают мне, когда мне нужно «издеваться» (извинения за использование этого слова) golang std. библиотечные пакеты, такие как «fmt».
я придумал два сценария:
- использование OS/Exec протестировать интерфейс командной строки
- обертка FMT пакет поэтому я должен контролировать и я в состоянии проверить выход строки
Я не люблю оба сценария:
- Мне кажется, что в реальной командной строке запутанная и не-исполнительная (см. Ниже). Могут возникнуть проблемы с переносимостью.
- Я считаю, что это путь, но я боюсь, что упаковка пакета fmt может быть большой работой (по крайней мере, упаковка пакета времени для тестирования оказалась нетривиальной задачей (https://github.com/finklabs/ttime)).
Актуальный вопрос здесь: Есть ли другой (лучший/более простой/идиоматический) способ? Примечание: Я хочу сделать это в чистом голанге, меня не интересует следующая платформа тестирования.
cli_test.go:
package main
import(
"os/exec"
"testing"
)
func TestCli(t *testing.T) {
out, err := exec.Command("go run sample.go").Output()
if err != nil {
t.Fatal(err)
}
if string(out) != "May the force be with you!\nError: this is broken and not useful!\nexit status 1" {
t.Fatal("There is something wrong with the CLI")
}
}
ничего себе, я не знал, что Пайк написал книгу. Не могли бы вы указать название или ссылку на книгу. Мне нравятся ваши советы. Я собираюсь реорганизовать свой код и сообщить об этом. Спасибо огромное! – mark
Язык программирования Go http://www.gopl.io/ Alan A. A. Donovan · Brian W. Kernighan Опубликовано 26 окт 2015 в мягкой обложке и 20 ноября в электронной книге Addison-Wesley; 380pp; ISBN: 978-0134190440 – Amnon
Я реорганизовал код, следующий за вашим советом. Я надеюсь, что вы не возражаете, я добавил, что я подошел к вашему ответу, чтобы сделать его явным. Если я неправильно понял что-то, пожалуйста, измени его. Кстати, кажется, что проблема с os.Exit. – mark