golang测试不正确地比较等式

golang测试不正确地比较等式,go,testing,test-double,Go,Testing,Test Double,我正在学习围棋,并且正在改编一个Java生活游戏的例子。但是,我编写的测试spy错误地比较了我的Worldstruct的相等性-测试在失败时通过,因为没有调用output(World)。我做错了什么 测试: 实施: package gameoflife type SimulatesConway struct { generatesSeedWorld GeneratesSeedWorld outputsWorld OutputsWorld } func NewSim

我正在学习围棋,并且正在改编一个Java生活游戏的例子。但是,我编写的测试spy错误地比较了我的
World
struct的相等性-测试在失败时通过,因为没有调用
output(World)
。我做错了什么

测试:

实施:

package gameoflife

type SimulatesConway struct {
    generatesSeedWorld GeneratesSeedWorld
    outputsWorld       OutputsWorld
}

func NewSimulatesConway(generatesSeedWorld GeneratesSeedWorld, outputsWorld OutputsWorld) SimulatesConway {
    return SimulatesConway{generatesSeedWorld: generatesSeedWorld, outputsWorld: outputsWorld}
}

func (sc *SimulatesConway) simulate() {
    // seedWorld := sc.generatesSeedWorld.generate()
    // sc.outputsWorld.output(seedWorld)
}

type GeneratesSeedWorld interface {
    generate() World
}

type OutputsWorld interface {
    output(world World)
}

type World struct{}

调用
outputsWorldSpy:=outputsWorldSpy{}
时,golang在
outputsWorldSpy.outputCalledWithWorld=World{}
中分配了默认值,并且您分配了
seedWorld:=World{}
。所以它们是一样的,这就是为什么测试通过了。如果你想处理这种情况,我建议使用指针

type OutputsWorldSpy struct {
    outputCalledWithWorld *World
}

func (ow *OutputsWorldSpy) output(world World) {
    ow.outputCalledWithWorld = &world
}

func (ow *OutputsWorldSpy) wasOutputCalledWithWorld(world World) bool {
    if ow.outputCalledWithWorld == nil {
        return false
    }
    return cmp.Equal(world, *ow.outputCalledWithWorld)
}

所有
World
值都是相等的。为什么他们不会呢?它们没有什么区别。我不熟悉cmp包,但是本机相等。啊,好吧,为了检查我的理解,如果我定义了一个结构并且没有给它的成员分配任何值,它们将被分配一个默认值,因此相等比较通过了吗?通过检查内存地址是否为零,我们可以防止在检查两者是否相等之前没有分配任何内容的情况?
type OutputsWorldSpy struct {
    outputCalledWithWorld *World
}

func (ow *OutputsWorldSpy) output(world World) {
    ow.outputCalledWithWorld = &world
}

func (ow *OutputsWorldSpy) wasOutputCalledWithWorld(world World) bool {
    if ow.outputCalledWithWorld == nil {
        return false
    }
    return cmp.Equal(world, *ow.outputCalledWithWorld)
}