Поддельный метод не работает в golang во время выполнения тестов - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь смоделировать метод struct в тестовых случаях, но он не работает. Я хочу смоделировать Проверить метод здесь: `

package main

import (
    "fmt"
)

type DemoInterface interface {
    Inc(int) (int, error)
    Validate(int) error
}
type DemoStruct struct{}

func (l DemoStruct) Inc(num int) (int, error) {
    err := l.Validate(num)
    if err != nil {
        return 0, err
    }
    num = num + 100
    return num, nil

}
func (l DemoStruct) Validate(num int) error {// SOME DB LOGIC IS HERE WHICH I CAN NOT POST at Stackoverflow
    if num > 100 {
        return fmt.Errorf("INVALID NUM %v", num)
    }
    return nil
}

func main() {
    s, err := DemoStruct{}.Inc(10)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(s)

}

`

Мои тестовые случаи:

package main

import (
    "fmt"
    "testing"
)

const (
    SUCCESS = "SUCCESS"
    ERROR   = "ERROR"
)

type MockDemoStruct struct {
    DemoStruct
    functionality string
}

func (m MockDemoStruct) Validate(num int) error {
    switch m.functionality {
    case SUCCESS:
        return nil
    case ERROR:
        fmt.Errorf("MOCK ERROR %v", num)

    }
    return fmt.Errorf("MOCK ERROR %v", num)
}

func TestPath(t *testing.T) {

    t.Run("ERROR", func(t *testing.T) {
        ls := MockDemoStruct{DemoStruct{}, ERROR}
        res, err := ls.Inc(110)
        expected := fmt.Errorf("MOCK ERROR %v", 10)
        if err != expected {
            t.Errorf("NOT MATCH  %v  %v", err, expected)
            //NOT MATCH  INVALID NUM 110  MOCK ERROR 10

        }
        fmt.Println(res)
    })
}

Здесь MockDemoStruct. Подтвердить не вызывается. Я получаю НЕВЕРНЫЙ НОМЕР 110 от Validate, но это должно быть MOCK ERROR 110

Ответы [ 3 ]

1 голос
/ 12 января 2020

Для того, чтобы сделать метод насмешливым, нам нужно будет использовать шаблон кода на основе DI (внедрение зависимостей).

**We can mock only those methods which are injectable**.

У нас есть два варианта для введения внедрение зависимостей в этот код.

  1. Использование шаблона проектирования делегирования с помощью интерфейса

  2. Внесение исправлений Monkey с использованием функции в качестве типа

Делегирование с использованием интерфейса:

type Deligation interface {
    Validate(num int) error
}

type DemoStruct struct {
    delegate Deligation
}

func (DemoStruct) Validate(num int) error {
    if num > 100 {
        return fmt.Errorf("INVALID NUM %v", num)
    }
    return nil
}
func (l DemoStruct) Inc(num int) (int, error) {
    err := l.delegate.Validate(num) // Call method using delegate
    if err != nil {
        return 0, err
    }
    num = num + 100
    return num, nil

}

func main() {
    s, err := DemoStruct{delegate: DemoStruct{}}.Inc(10) // assign delegate inside DemoStruct
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(s)

}

Использование исправлений Monkey:

func Validate(num int) error {
    if num > 100 {
        return fmt.Errorf("INVALID NUM %v", num)
    }
    return nil
}

type DemoStruct struct {
    Validate func(num int) error //  function as a type
}

func (l DemoStruct) Inc(num int) (int, error) {
    err := l.Validate(num)// It can be replaced in test cases.
    if err != nil {
        return 0, err
    }
    num = num + 100
    return num, nil

}

func main() {
    s, err := DemoStruct{Validate: Validate}.Inc(10) // assign Validate inside DemoStruct
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(s)

}

Ссылка: https://blog.myhro.info/2018/06/how-to-mock-golang-methods

1 голос
/ 11 января 2020

В этом случае метод Inc в DemoStruct вызывает метод l.Validate, где l - DemoStruct. Получатель этого метода явно DemoStruct. Таким образом, метод MockDemoStruct.Validate вызываться не будет.

Go не имеет наследования, как вы предполагали здесь в своем коде. Вы не можете переопределить метод DemoStruct. MockDemoStruct составляет DemoStruct. Чтобы на самом деле протестировать этот метод, я предлагаю пройти интерфейс DemoStruct a db, который можно смоделировать в вашем тесте.

0 голосов
/ 11 января 2020

Я думаю, вам также нужно реализовать приемник 'In c' для 'MockDemoStruct', здесь вы пытаетесь использовать свойство наследования struct, похоже, что GO не поддерживает это.

...