試圖模擬以下功能。它基本上從 S3 ( io.ReadCloser) 中獲取一個對象并將其寫入一個文件,該文件執行os.Open()時間較早 ( io.WriteCloser)。package mainimport ( "io" log "github.com/sirupsen/logrus")func writeFile(destination io.WriteCloser, source io.ReadCloser) error { defer destination.Close() defer source.Close() _, err := io.Copy(destination, source) if err != nil { log.WithFields(log.Fields{"desc": "unable to copy contents from s3 to blahblah"}).Error(err) return err } return nil}我想我已經很接近了,但目前我的測試掛起并且永遠不會出錯/成功......我也意識到我可以os.Stdout到達目的地,但仍然遇到了同樣的問題。里面發生了一些事情io.Copy。我想這是因為我試圖將空數據復制為空?package mainimport ( "errors" "io" "reflect" "testing")type mockReadCloser struct {}func (m mockReadCloser) Read(p []byte) (int, error) { return 0, nil }func (m mockReadCloser) Close() error { return nil }type mockWriteCloser struct{}func (m mockWriteCloser) Close() error { return nil }func (m mockWriteCloser) Write(b []byte) (n int, err error) { return 0, nil }func Test_writeFile(t *testing.T) { type args struct { destination io.WriteCloser source io.ReadCloser } tests := []struct { name string args args wantErr bool }{ { name: "", args: args{ destination: &mockWriteCloser{}, source: &mockReadCloser{}, }, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := writeFile(tt.args.destination, tt.args.source); (err != nil) != tt.wantErr { t.Errorf("writeFile() error = %v, wantErr %v", err, tt.wantErr) } }) }}
1 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
這是因為io.Copy直到 EOF 或錯誤才返回。
將副本從 src 復制到 dst,直到在 src 上到達 EOF 或發生錯誤。它返回復制的字節數和復制時遇到的第一個錯誤(如果有)。
成功的 Copy 返回 err == nil,而不是 err == EOF。因為 Copy 被定義為從 src 讀取直到 EOF,所以它不會將 Read 的 EOF 視為要報告的錯誤。
因此,如果您從 返回 EOF mockReadCloser.Read
,它就不會再掛起。
func (m mockReadCloser) Read(p []byte) (int, error) { return 0, io.EOF }
這是因為 Read 被重復調用,直到沒有更多內容可讀 (EOF)。
for { nr, er := src.Read(buf) ... }
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消