我在我的Ubuntu 12.04.1笔记本电脑上运行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()没有返回测试场景中的所有数据,但我仍然感到困惑,为什么会发生这种情况。
答案 0 :(得分: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
答案 1 :(得分: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”只是为了面向未来