Hello,
I am trying out golang and like it's concepts (coming from Python and Java mostly, not having Exceptions felt a bit strange at the start, though :-)).
* Now I try to write tests for
https://github.com/caradojo/trivia/blob/master/go/trivia.go for the fun of it.
* I want to do this without modifying the code (too much).
* I already introduced my own fake[1] random and now need to replace os.Stdout with a fake implementation as the results of the game implemented here are written with `fmt.Println` resp. `fmt.Printf`.
* My first approach was to use a tempfile[2], this works but I do not like to touch the disk during tests.
* In Java `System.out` is just a `PrintStream` which is easily replaced by sth. like `System.setOut(new PrintStream(new ByteArrayOutputStream()));`
* Now in golang `os.Stdout` is an `*os.File` which is mostly a wrapper for an OS specific file.
I now tried something like this:
```
type file interface {
io.Writer
}
type fakeFile struct {
out *bytes.Buffer
}
func (ff fakeFile) Write(p []byte) (n int, err error) {
return ff.out.Write(p)
}
func foo()
realStdout := os.Stdout
defer func() { os.Stdout = realStdout }()
var out []byte
var f file = fakeFile{bytes.NewBuffer(out)}
os.Stdout = &os.File{&f}
)
```
This does not compile but I get "cannot use &f (type *file) as type *os.file in field value".
Then I tried a Pythonesque approach, something like this:
```
realStdoutWrite := os.Stdout.Write
defer func() { os.Stdout.Write = realStdoutWrite }()
var outb = bytes.NewBufferString("")
os.Stdout.Write = outb.Write
```
but get "cannot assign to os.Stdout.Write"
In a real world example I would not write to os.Stdout but inject an `io.Writer` which would be used,
so this is more a question whether I miss something or is faking os.Stdout really hard?
Any hints appreciated :-)
Regards
Mirko
[1] https://martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs
[2] https://github.com/mfriedenhagen/trivia/commit/b8ecec0097bfb4a6e7e2992e1401274cff06c03b#diff-2a08ba5d9ea423f34350a051d2333274R44