我的帖子有2个问题
我基本上是想了解如何将gomock与gingko一起使用
GOPATH
/Users/Ratatouille/Desktop/test/goExample
以下项目位于
/Users/Ratatouille/Desktop/test/goExample/square
具有以下项目结构
.
├── area.go
└── area_test
├── area_mock.go
├── area_mock_test.go
└── area_suite_test.go
我无法理解为什么我会收到以下错误
Failed to compile area_test:
can't load package: package ./area_test: found packages area_test (area_mock.go) and area (area_mock_test.go) in /Users/Ratatouille/Desktop/test/goExample/square/area_test
Ginkgo ran 1 suite in 303.243871ms
Test Suite Failed
我的第二个问题是项目回购有像这样的area.go文件
package main
import "fmt"
type Square struct {
side float32
}
func (s *Square) Area() float32 {
return s.side * s.side
}
func (s *Square) CalculateArea(shaper Shaper) float32 {
shaper.Area()
}
type Shaper interface {
Area() float32
}
func main() {
sq1 := new(Square)
sq1.side = 2
var areaIntf Shaper
areaIntf = sq1
fmt.Println(areaIntf.Area())
}
我的问题是如何导入 main
包area_mock_test.go
答案 0 :(得分:2)
您的项目结构不是Go所期望的。
area_test/
不是area
的测试。我猜猜你跑了go test ./area_test
。这告诉Go ./area_test
是一个项目。它尝试编译area_mock.go
并尝试使用area_mock_test.go
和area_suite_test.go
作为测试。你得到的错误是告诉你它不希望在项目文件中找到一个名为*_test
的包的尴尬方式。
area.go
也是一个问题。您可以使用package main
,但然后尝试使用package area_test
进行测试。他们不匹配,Go不会喜欢它。包目录包含 一个包 。其测试必须使用该包或thatpackage_test
。这强制包目录做一件事。它要么是要导入的库,要么是要运行的程序。不是两个。
项目目录也称为square
,但程序包为area
。可以使文件与项目名称不匹配,并且可以在一个包中包含多个文件,但是使用包而不是项目目录名是不好的做法。
还有另一个问题。 Go期望源文件位于$GOPATH/src
。您可以直接在$GOPATH
中找到它们。导入语句无法找到它们。
Go的项目结构可能需要一些时间来适应,并且它对如何构建项目和包有非常坚定的想法(Go对如何编写代码以及如何编写代码有非常坚定的想法它不是。不要打它。帮自己一个忙,并使用GOPATH
的默认~/go
并将您的代码放入~/go/src/
。
您可以像这样编写方形库。
~/go/src/square/
|--- square.go
|--- square_test.go
square.go可能看起来像这样。
package square
type Square struct {
Side float32
}
func (s Square) Area() float32 {
return s.Side * s.Side
}
请注意,Side
必须大写才能成为公共数据成员。还要注意它传递的值,在Go中,如果你打算修改结构,那么它只能通过指针传递。
square_test.go可能看起来像这样。
package square_test
import(
"testing"
"square"
"github.com/stvp/assert"
)
func TestArea( t *testing.T ) {
sq := square.Square{Side: 5}
assert.Equal( t, sq.Area(), float32(25) )
}
Go没有任何断言。 github.com/stvp/assert
提供了基础知识并消除了大量乏味。你可以使用go get github.com/stvp/assert
获得它。
请注意,它是package square_test
使其成为黑盒测试,只能使用square
的公共接口。如果你想要一个玻璃盒/内部测试,它将使用package square
并进入自己的文件,如square_internal_test.go
。
如果你想要一个使用square的程序,它将在它自己独立的包目录中。它会main.go
package main
和import "square"
。
How To Write Go更详细地解释了这一点。