gpt4 book ai didi

golang test spy 错误地比较相等性

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:16 26 4
gpt4 key购买 nike

我正在学习围棋并正在改编来自 testdouble 的 Java 生命游戏示例.然而,我编写的测试 spy 错误地比较了我的 World 结构的相等性——测试在它应该失败的时候通过了,因为 output(world) 没有被调用。我做错了什么?

测试:

package gameoflife

import (
"testing"

"github.com/google/go-cmp/cmp"
)

func TestZeroGenerations(t *testing.T) {
generatesSeedWorldStub := GeneratesSeedWorldStub{}
outputsWorldSpy := OutputsWorldSpy{}
conway := NewSimulatesConway(&generatesSeedWorldStub, &outputsWorldSpy)
seedWorld := World{}

conway.simulate()

correctWorld := outputsWorldSpy.wasOutputCalledWithWorld(seedWorld)
if !correctWorld {
t.Errorf("Output called with seed world, expected: %t, got: %t", true, correctWorld)
}
}

type GeneratesSeedWorldStub struct{}

func (gsw *GeneratesSeedWorldStub) generate() World {
return World{}
}

type OutputsWorldSpy struct {
outputCalledWithWorld World
}

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

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

实现:

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)
}

关于golang test spy 错误地比较相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com