Как проверить зависимость была названа правильно - PullRequest
0 голосов
/ 09 декабря 2018

В Go, как мне проверить, что фиктивная зависимость была вызвана правильным образом.

Если у меня есть структура, которая принимает интерфейс для зависимости, после внедрения я хочу иметь возможность проверитьбыл вызван исходный фиктивный объект.

Мой текущий код в этом примере я не вижу, что значение структуры изменилось.Если я изменяю свой код для передачи по ссылке, это вызывает ошибку:

s.simpleInterface.Call undefined (тип * SimpleInterface - указатель на интерфейс, а не интерфейс)

type SimpleInterface interface {
    Call()
}

type Simple struct {
    simpleInterface SimpleInterface
}

func (s Simple) CallInterface() {
    s.simpleInterface.Call()
}

type MockSimple struct {
    hasBeenCalled bool
}

func (ms MockSimple) Call() {
    ms.hasBeenCalled = true
}

func TestMockCalled(t *testing.T) {
    ms := MockSimple{}
    s := Simple{
        simpleInterface: ms,
    }
    s.CallInterface()

    if ms.hasBeenCalled != true {
        t.Error("Interface has not been called")
    }
}

1 Ответ

0 голосов
/ 09 декабря 2018

Я вижу три простых способа исправить это:

1- Измените сигнатуру метода Call, чтобы получить указатель на MockSimple, а при создании экземпляра простой структуры присвойте ему адрес вашего макета:

func (ms *MockSimple) Call() {
    ms.hasBeenCalled = true
}

func TestMockCalled(t *testing.T) {
    ms := MockSimple{}
    s := Simple{
        simpleInterface: &ms,
    }
    s.CallInterface()

    if ms.hasBeenCalled != true {
        t.Error("Interface has not been called")
    }
}

2 - Не самое чистое решение, но все еще работает.Используйте его, если вы действительно не можете использовать # 1.Объявите «hasBeenCalled» где-то еще и измените ваш MockSimple, чтобы он содержал указатель на него:

type MockSimple struct {
    hasBeenCalled *bool
}

func (ms MockSimple) Call() {
    *ms.hasBeenCalled = true
}

func TestMockCalled(t *testing.T) {
    hasBeenCalled := false
    ms := MockSimple{&hasBeenCalled}
    s := Simple{
        simpleInterface: ms,
    }
    s.CallInterface()

    if hasBeenCalled != true {
        t.Error("Interface has not been called")
    }
}

3 - возможно, действительно плохое решение : использование глобальных переменных, поэтому я бы использовал его только какв крайнем случае (всегда избегайте глобального состояния).Сделайте «hasBeenCalled» глобальным и измените его из метода.

var hasBeenCalled bool

type MockSimple struct{}

func (ms MockSimple) Call() {
    hasBeenCalled = true
}

func TestMockCalled(t *testing.T) {
    ms := MockSimple{}
    s := Simple{
        simpleInterface: ms,
    }
    s.CallInterface()

    if hasBeenCalled != true {
        t.Error("Interface has not been called")
    }
}

Приветствия!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...