在go test和go run中,Go代码的行为有所不同

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() 没有返回所有的数据,但我仍然不明白为什么会发生这种情况。
2个回答

4
在测试中,您应该检查函数调用的结果。
测试在控制台上使用/dev/null运行。因此,fmt/log输出不可见。您应该在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 test的输出

PASS
ok      test    0.843s

我的 Go 版本是 go version devel +87f67aadaed6 Sat Dec 22 17:41:00 2012 -0800 darwin/amd64


2
我尝试了rputikar的解决方案(使用t.Fatal()代替fmt.Println()),但没有帮助。
注意到 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",以便未来不出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接