Шпион теста Голанга неправильно сравнивает равенство

Я нахожусь в процессе обучения и адаптирую пример Java Game of Life из testdouble. Однако тестовый шпион, которого я написал, неправильно сравнивает равенство моих World struct - тест проходит, когда он должен потерпеть неудачу, так как 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{}

1 ответ

Решение

Когда звонили outputsWorldSpy := OutputsWorldSpy{} Голангу присвоено значение по умолчанию в 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)
}
Другие вопросы по тегам