Как смоделировать функцию в го? - PullRequest
0 голосов
/ 31 октября 2018
package main

import (
    "net/http"
    "sync"
    "time"
)

type SessionInterface1 interface {
    doLoginAndReadDestinations1() bool
}

type Session1 struct {
    sessionCookie string
    mux           sync.Mutex
    sessionTime   time.Time
    targetAddress string
    currentJwt    string
    transport     *http.Transport
}

var currentSession1 Session1

func main() {

    currentSession1.verifyLogin1()

}

func (s *Session1) doLoginAndReadDestinations1() bool {
    ..logic...
    ... for example return true

}

func callDest1(si SessionInterface1) bool {
    return si.doLoginAndReadDestinations1()
}

func (s *Session1) verifyLogin1() bool {
    return callDest1(s)
}

Я хочу создать модульный тест и смоделировать doLoginAndReadDestination1 Я попытался создать интерфейс для этого метода, и я создаю тест

func test1(t *testing.T) {
    type args struct {
    }
    tests := []struct {
        name string
        args args
        want bool
    }{{
        name: "test",
        args: args{},
        want: false,
    }}
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            var s1 *Session1
            count := 10
            s1 = &Session1{"", sync.Mutex{}, time.Now(), "", "", nil}

            var got1 = s1.verifyLogin()

            if got1 != tt.want {
                t.Errorf("getJwt() = %v, want %v", got, tt.want)
            }

        })
    }
}

Я не знал, как я могу изменить логику функции doLoginAndReadDestination1 в тесте и изменить логику в первом основном

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вам нужно будет абстрагироваться от всего, что вы хотите издеваться. Вместо того, чтобы разрешать зависимость как конкретную реализацию, используйте интерфейс. Тогда вы сможете создать макет, который будет реализовывать этот интерфейс.

Как правило, я бы предложил вам stretchr / testify для тестирования. У него есть методы для:

  1. 1008 * утверждают *
  2. 1010 * требуется *
  3. фиктивный
  4. люкс

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

0 голосов
/ 31 октября 2018

В вашем модульном тесте вы вызываете методы только на Session1, а не на том, что вызывает Session1 методы; так что тут не над чем издеваться При использовании насмешек для тестов вы не высмеиваете методов , вы высмеиваете типов , когда эти типы зависимости тестируемого типа. Например, если у вас есть тип Foo, который зависит (вызывает методы) от типа Bar, и вы хотите проверить Foo изолированно, вы создадите макет типа Bar, и в вашем тесты на Foo, вы дали бы ему BarMock вместо Bar. В вашем реальном коде вы дадите ему реальный Bar. Нет способа издеваться над единственным методом типа.

Вам может пригодиться этот вопрос StackOverflow и его подробные ответы.

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