6

Ubuntu 12.04.1 ラップトップで go 1.0.3 を実行していますが、main() でコードを実行すると、go test で実行した場合とは動作が大きく異なるという問題に遭遇しました。

これが私の例です:
main.goから

package main

import (
    "image"
    "image/jpeg"
    "fmt"
    "myproj/htmlutil"
    [some imports removed]
)

func main() {
    img, err := htmlutil.GetResizedImageFromWeb("http://img.foodnetwork.com/FOOD/2011/05/04/FNM_060111-OOT-B005_s4x3.jpg")

    if err != nil {
        fmt.Println("There was a problem ",err)
    }
    fmt.Println("Bounds were ",img.Bounds())
}

myproj/htmlutil_test.go から

package htmlutil

import (
    "image"
    "fmt"
    "testing"
    [some imports removed]
)

func TestGetImageFromURL(t *testing.T){
    img, err := GetResizedImageFromWeb("http://img.foodnetwork.com/FOOD/2011/05/04/FNM_060111-OOT-B005_s4x3.jpg")

    if err != nil {
        t.Fatalf("There was a problem %q",err)
    }
    fmt.Println("Bounds were ",img.Bounds())
}

彼らが呼び出す関数、GetResizedImageFromWeb() は myproj/htmlutil.go にあります。

package htmlutil

import (
    "errors"
    "fmt"
    "image"
    "io/ioutil"
    "net/http"
    [some imports removed]
)

func GetResizedImageFromWeb(imageURL string) (image.Image, error) {
    resp, err := http.Get(imageURL)
    if err != nil {
        return nil, errors.New(fmt.Sprint("There was a problem reading the site %q Debug[%s]",imageURL, err))
    }
    defer resp.Body.Close()
    //Decode the image using image's general purpose decoder
    image, s, err := image.Decode(resp.Body)
    if err != nil {
        return nil, err
    }

    return resizeImage(image), nil
}

コマンド ラインから「go run main.go」を実行すると、url から画像の境界が表示され、main.go の関数を使用したい場合は、画像を jpg ファイルとしてディスクに保存できます。ただし、htmlutil パッケージから「go test」を実行すると、次のエラーが発生します。

There was a problem "image: unknown format"

単体テストでのみ失敗する問題の原因は何ですか? 私は何を間違っていますか?

私の唯一の推測は、何らかの理由で html.Get() がテスト シナリオですべてのデータを返さないということですが、なぜそれが起こるのかについてはまだ困惑しています。

4

2 に答える 2

4

テストでは、関数呼び出しの結果を実際に確認する必要があります。

テストは、コンソールで/ dev/nullを使用して実行されます。したがって、fmt/ログ出力は表示されません。htmlutil_test.goで次のようなことを行う必要があります

func TestMain(t *testing.T) {
    img, err := GetResizedImageFromWeb("http://img.foodnetwork.com/FOOD/2011/05/04/FNM_060111-OOT-B005_s4x3.jpg")
    if err != nil {
        t.Error("There was a problem ", err)
    }

    bounds := image.Rectangle{
        image.Point{0, 0},
        image.Point{616, 462}}

    if img.Bounds() != bounds {
        t.Error("Incorrect Bounds were ", img.Bounds())
    }

}

次のようにコードをコピーしました。

main.go

package main

import (
    "errors"
    "fmt"
    "image"
    _ "image/jpeg"
    "net/http"
)

func GetResizedImageFromWeb(imageURL string) (image.Image, error) {
    resp, err := http.Get(imageURL)
    if err != nil {
        return nil, errors.New(fmt.Sprint("There was a problem reading the site %q Debug[%s]", imageURL, err))
    }
    defer resp.Body.Close()
    //Decode the image using image's general purpose decoder
    image, _, err := image.Decode(resp.Body)
    if err != nil {
        return nil, err
    }

    return image, nil
}

func main() {
    img, err := GetResizedImageFromWeb("http://img.foodnetwork.com/FOOD/2011/05/04/FNM_060111-OOT-B005_s4x3.jpg")

    if err != nil {
        fmt.Println("There was a problem ", err)
    }
    fmt.Println("Bounds were ", img.Bounds())
}

main_test.go

package main

import (
    "image"
    "log"
    "testing"
)

func TestMain(t *testing.T) {
    img, err := GetResizedImageFromWeb("http://img.foodnetwork.com/FOOD/2011/05/04/FNM_060111-OOT-B005_s4x3.jpg")
    if err != nil {
        t.Error("There was a problem ", err)
    }

    bounds := image.Rectangle{
        image.Point{0, 0},
        image.Point{616, 462}}

    if img.Bounds() != bounds {
        t.Error("Incorrect Bounds were ", img.Bounds())
    }
}

goテストの出力

PASS
ok      test    0.843s

私の行くバージョンはgo version devel +87f67aadaed6 Sat Dec 22 17:41:00 2012 -0800 darwin/amd64

于 2012-12-30T04:06:21.393 に答える
2

rputikarの解決策(fmt.Println()の代わりにt.Fatal()を使用)を試しましたが、それは役に立ちませんでした。

、rputikarが彼の輸入品で私とは微妙に異なることをしていることに気づきました。htmlutil.goへのインポートは次のようになりました。

package htmlutil    

import (
    "errors"
    "fmt"
    "image"
    "io/ioutil"
    [some imports removed]
    "net/http"
)

しかし、私のmain.goとrputikarのmain_test.goの両方に、追加のインポート 「image/jpeg」が含まれていました。そこで、それをhtmlutil.goインポートリストに追加すると、問題が解決しました。将来を保証するために、 「_ image/png」と「_image /gif」を追加すると思います

于 2012-12-30T17:40:33.563 に答える