Методы насмешки в тесте - PullRequest
       9

Методы насмешки в тесте

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

У меня есть класс, который я хочу проверить:

type ApiGateway struct {
    username  string
    password  string
    scsClient *scsClient.APIDocumentation
    auth      Auth
}

type Auth struct {
    token   string
    validTo int32
}

func New(host string, scheme string, username string, password string) *ApiGateway {
    var config = scsClient.TransportConfig{host, "/", []string{scheme}}
    var client = scsClient.NewHTTPClientWithConfig(strfmt.Default, &config)

    return &ApiGateway{username, password, client, Auth{}}
}

func (s *ApiGateway) isTokenValid() bool { ... }

Этот метод isTokenValid вызывается из любого другого метода внутри класса для проверки и / или обновления токена API.В тестах я хочу смоделировать этот метод, поэтому он всегда возвращает true, например.

Как мне это архивировать?


Редактировать: Мой код:

apiGateway.go

type StubAdapter struct {
    ApeGatewayAdapter
}

type ApeGatewayAdapter interface {
    isTokenValid() bool
}

type ApiGateway struct {
    username  string
    password  string
    scsClient *scsClient.APIDocumentation
    auth      Auth
    adapter ApeGatewayAdapter
}

type Auth struct {
    token   string
    validTo int32
}

func New(host string, scheme string, username string, password string, a ApeGatewayAdapter) *ApiGateway {
    var config = scsClient.TransportConfig{host, "/", []string{scheme}}
    var client = scsClient.NewHTTPClientWithConfig(strfmt.Default, &config)

    return &ApiGateway{username, password, client, Auth{}, a}
}

apiGateway_test.go

type MockAdapter struct {
    ApeGatewayAdapter
}

func (m MockAdapter) isTokenValid() bool {
    return true
}

func TestApiGateway_GetDevice(t *testing.T) {
    var scsGateway = New("foo.com", "http", "testuser", "testpwd", MockAdapter{})

    fmt.Println(scsGateway.isTokenValid())
}

Я ожидаю, что тест вызовет мой смоделированный метод и вернет true , которого нет.

1 Ответ

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

Проблема в том, что вы определили isTokenValid() в вашем MockAdapter вместо ApeGatewayAdapter.Поэтому, когда вы пытаетесь проверить, он говорит, что

scsGateway.isTokenValid undefined (тип * ApiGateway не имеет поля или метода isTokenValid)

Вам необходимо изменить свою архитектурув ваших структурах, потому что вы создали метод New() для адаптера (и это нормально), но важная вещь здесь (и почти всегда в Go) возвращает интерфейс!

isTokenValid() определен для внешнего типа (в вашем тестовом примере для MockAdapter), поэтому вы не можете вызывать его, если вы не измените определение своих типов или не измените реализацию метода с MockAdapter to ApeGatewayAdapter.

Я думаю, что лучшим решением должно быть удаление StubAdapter и работа напрямую с ApiGateway и определение метода isTokenValid() для этих типов.Тогда ваш тест должен работать, удаляя внутренний ApeGatewayAdapter и используя только MockAdapter для макета apigateway и его метода.

Ваш код должен выглядеть следующим образом:

gateway.go

package gateway

type ApeGatewayAdapter interface {
    isTokenValid() bool
}

type ApiGateway struct {
    username string
    password string
    auth     Auth
}

type Auth struct {
    token   string
    validTo int32
}

func (a ApiGateway) isTokenValid() bool {
    // TODO add your validations
    return true
}

func New(host string, scheme string, username string, password string) ApeGatewayAdapter {

    return ApiGateway{username, password, Auth{}}
}

gateway_test

package gateway

import (
    "fmt"
    "testing"
)

type MockAdapter struct {
}

func (m MockAdapter) isTokenValid() bool {
    return true
}


func TestApiGateway_GetDevice(t *testing.T) {

    gateway := MockAdapter{}
    if gateway.isTokenValid() != true {
        t.Error("Not true")
    }
}
...