Модульные тесты макетируют интерфейс из свойства struct - PullRequest
0 голосов
/ 14 апреля 2020

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

Это код:

type Server struct{
    parser: Parser
}

type Parser interface{
    SetProvider(p *Provider)
}

func (s *Server) doSomething(){
    s.anotherAction()
    // ...
    // here it crashes because I haven't assigned anything to parser in serverMock
    s.parser.SetProvider(&Provider{
        name: "foo"
    })
}

А это тестовый код:

var serverMock = &Server{
    parser:
}

// mock SetProvider
func (s *Server) SetProvider(p *Provider) {
    // some action
}


TestMyCustomTest(){
    res, err := serverMock.doSomething()
    expected := struct{
        hobby: "code",
    }
    assert.Equal(t, &expected, res)
}

Как видите, я ничего не назначил для parser: с var serverMock, потому что я до сих пор не знаю, что мне делать, чтобы это работало , Я не могу назначить mockInterface для этого поля синтаксического анализатора, потому что он скажет мне, что исходная структура сервера требует интерфейс Parser, а не фиктивный, и я думаю, что мне нужен указатель &Server для var serverMock = &Server, потому что он использует другие действия, такие как s.anotherAction().

1 Ответ

0 голосов
/ 14 апреля 2020

Если я правильно понимаю ваше намерение, вы хотите проверить метод Server doSomething, и это зависит от метода Parser.SetProvider. Итак, вместо макетирования Server вам нужно создать фиктивную структуру, которая удовлетворяет интерфейсу Parser, и создать экземпляр Server, который его использует. Вот пример такого теста:

type mockParser struct {
    // You can add field here
}

// mockParser implements SetProvider(p *Provider) method so that it satisfies Parser interface
func (parser *mockParser) SetProvider(provider *Provider) {
    // You can do something here
}

TestMyCustomTest(t *testing.T){
    parser := mockParser{}
    srv := &Server{parser: &parser}

    // write your test

    assert.Equal(t, ...)
}

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