megakor
@megakor
Go/PHP developer | Вконтакте

Почему проходит тест с моком при любом возвращаемом значении?

Учусь мокать на Го с помощью библиотеки testify.

Есть простая структура, метод которой позволяет умножать A и B.

package multiplier

type Multiplier interface {
	Calculate(num int, times int) int
}

func NewMultiplier() Multiplier {
	return new(multiplier)
}

type multiplier struct {
}

func (m multiplier) Calculate(num int, times int) int {
	return num * times
}

func CalculateFiveTimesFive(m Multiplier) int {
	return m.Calculate(5, 5)
}


Есть тест, который тестирует умножение 5 на 5 и я хочу проверить что возвращается именно 25.

package multiplier_test

import (
	"awesomeproject/internal/multiplier"
	"github.com/stretchr/testify/mock"
	"testing"
)

type MultiplierTestObject struct {
	mock.Mock
}

func (o *MultiplierTestObject) Calculate(num int, times int) int {
	args := o.Called(num, times)
	return args.Int(0)
}

func TestCalculateFiveTimesFive(t *testing.T) {
	m := new(MultiplierTestObject)

// Обратите внимание на эту строку (ниже)
	m.On("Calculate", 5, 5).Return(25)

	multiplier.CalculateFiveTimesFive(m)

	m.AssertExpectations(t)
}


Но проблема в том, что я никак не могу заасертить это.
Т.е. что бы я не вставил вместо 25, тест будет пройден:
m.On("Calculate", 5, 5).Return("могу хоть строку", 9999, 1111) // тест будет пройден

Что я делаю не так?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@falconandy
Есть тест, который тестирует умножение 5 на 5 и я хочу проверить что возвращается именно 25


Если вы хотите протестировать логику метода
func (m multiplier) Calculate(num int, times int) int
, то мок вам не нужен - тестируйте этот метод без всяких моков.

Если же вы хотите протестировать логику функции func CalculateFiveTimesFive(m Multiplier) int, то должны проверить в тесте, что она возвращает. При этом мок не обязан возвращать именно 25, а может вернуть любое число. По сути вы проверяете, что функция CalculateFiveTimesFive всегда возвращает результат вызова метода Calculate - такой тест выглядит довольно бесполезным (как и сама функция CalculateFiveTimesFive).

m.On("Calculate", 5, 5).Return(37)
assert.Equal(t, 37, multiplier.CalculateFiveTimesFive(m))
m.AssertExpectations(t)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы