Невозможно передать ошибку объекта Testify Mock - PullRequest
0 голосов
/ 09 июня 2018

Привет, я пытаюсь смоделировать структуру в GO.Я использую свидетельство, чтобы сделать это.Но я не могу заставить его работать и не понимаю, что я делаю неправильно.Ниже приведен пример файла main.go и main_test.go, который у меня есть

// Arithmetic ...
type Arithmetic interface {
    Add(int, int) int
    Subtract(int, int) int
}

// MathOperation ...
type MathOperation struct {}

// GetNewArithmetic ...
func GetNewArithmetic(obj Arithmetic) Arithmetic {
    if obj != nil {
        return obj
    }

    return MathOperation{}
}

// Add ...
func (a MathOperation) Add(num1 int, num2 int) int {
    return num1 + num2
}

// Subtract ...
func (a MathOperation) Subtract(num1 int, num2 int) int {
    return num1 - num2
}

А вот мой тестовый файл

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/mock"
)

type MyMock struct {
    mock.Mock
}

func (m *MyMock) Add(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0) + args.Int(1)
}

func (m *MyMock) Subtract(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0) + args.Int(1)
}

func TestDoComputation(t *testing.T) {
    testobj := new(MyMock)

    testobj.On("Add", 1, 2).Return(5)

    // a := GetNewArithmetic(testobj)

    result := GetNewArithmetic(testobj)

    assert.Equal(t, 5, result.Add(5, 6))
    testobj.AssertExpectations(t)
}

Я получаю эту ошибку

--- FAIL: TestDoComputation (0.00s)
panic:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6

The closest call I have is:

Add(int,int)
            0: 1
            1: 2


 [recovered]
        panic:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6

The closest call I have is:

Add(int,int)
            0: 1
            1: 2

goroutine 13 [running]:
testing.tRunner.func1(0xc420106870)
        /usr/lib/golang/src/testing/testing.go:711 +0x2d2
panic(0x701160, 0xc420011070)

Я понятия не имею, как это исправить, поскольку я впервые использую Go и Testify для проведения юнит-тестирования.Был бы признателен, если кто-то может взглянуть и иметь рабочую версию этого.Спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

В пакете свидетельства / макета

testobj.On («Добавить», 1, 2) .Return (5)

В приведенной выше строке указано значениефиктивный объект, который всякий раз, когда мы вызываем метод Add со следующими аргументами, должен возвращать 5. Return используется для передачи результата методу с заданными аргументами.

assert.Equal (t, 5, result.Add (5, 6))

В этой строке вы просите сопоставить ожидаемый результат с вызовом функции. Раньше вы определяете, когда передаете 1 и 2, функция должна вернуть 5, нов операторе Equal вы передаете значения 5 & 6

Все, что вам нужно, это изменить любую из одной строки на правильное значение.

testobj.On ("Добавить",5, 6). Возврат (5)

0 голосов
/ 09 июня 2018

Строка

testobj.On("Add", 1, 2).Return(5)

означает, что вы ожидаете, что макет testobj получит вызов его метода Add с аргументами 1 и 2, переданными ему, и вы также укажитечто этот вызов должен вернуть целочисленное значение 5.

Но вместо этого в этой строке

assert.Equal(t, 5, result.Add(5, 6))

вы вызываете метод Add с аргументами 5 и 6.

Это приводит к полученной вами ошибке:

mock: Unexpected Method Call
-----------------------------

Add(int,int)
            0: 5
            1: 6
// this is result.Add(5, 6), the 0: and 1: are indexes of the actually passed in aguments.

The closest call I have is:

Add(int,int)
            0: 1
            1: 2
// this is testobj.On("Add", 1, 2), and 0: and 1: are indexes of the expected arguments.

Кроме того, ваши фиктивные реализации пытаются вычислить и вернуть значение.Это не то, что должен делать макет.Вместо этого имитатор должен возвращать значение, предоставленное ему методом Return.

Способ сделать это можно с помощью значения args, возвращенного методом Calledвызовите, это значение будет содержать аргументы метода Return, проиндексированные в том же порядке, в котором они были переданы в Return.

Таким образом, целочисленное значение 5, которое вы передали Return в этой строке

testobj.On("Add", 1, 2).Return(5)

можно получить, используя служебный метод Int и передав ему 0-й индекс.То есть return args.Int(0) вернет значение интергера 5.

Таким образом, ваш тестовый файл должен выглядеть примерно так:

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/mock"
)

type MyMock struct {
    mock.Mock
}

func (m *MyMock) Add(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0)
}

func (m *MyMock) Subtract(num1 int, num2 int) int {
    args := m.Called(num1, num2)
    return args.Int(0)
}

func TestDoComputation(t *testing.T) {
    testobj := new(MyMock)

    testobj.On("Add", 1, 2).Return(5)

    // a := GetNewArithmetic(testobj)

    result := GetNewArithmetic(testobj)

    assert.Equal(t, 5, result.Add(1, 2))
    testobj.AssertExpectations(t)
}
...