Перейти тест функции с указателем ссылки - PullRequest
0 голосов
/ 04 июня 2018

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

func (this *Service) InList(idPerson string, personsId []string) bool {
    for _, personsId := range personsId {
        if id == idPerson {
            return true
        }
    }

    return false
}

Служба - это структура, определенная поверх класса.

Это тест, который я написал:

func TestValidatePersonID(t *testing.T) {
   personID := "12345"

   personIDs := []string{"12345", "123456t", "1234567a"}

   ok := *Service.InList(personID, personIDs)

   if !ok {
      t.Errorf("Id %v not found", personID)
   }
}

Еслия пытаюсь вызвать службу без * Я получаю сообщение об ошибке:

недопустимое выражение метода (требуется получение указателя)

Если я пытаюсь вызвать функцию (* Service).inList, он говорит, что мне не хватает аргумента.Я новичок в Go, если кто-то может указать мне, что я делаю неправильно и как я могу получить указатель получателя этой службы в моем тесте ?.Я был бы признателен за это.

Ответы [ 3 ]

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

Правильный синтаксис для выражения метода :

ok := (*Service).InList(nil, personID, personIDs)

Этот фрагмент добавляет nil в качестве аргумента получателя и использует скобки для правильного указания типа.

Подход, использованный в вопросе, не является идиоматическим.Либо вызовите метод для значения

s := Service{}
ok := s.InList(personID, personIDs)

, либо преобразуйте метод в функцию.

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

Если вы не ссылаетесь на объект-получатель, тогда у вас не должно быть его, сохраняйте свой код как можно более простым.

Существует три способа написания метода или функции, каждый из которых имеет свою цель.

  1. без получателя, когда в функции нет ссылки на получателя (мы называем это функцией)
  2. получатель значения, на получателя ссылаются, но в методе мы его не меняем (мыназовите это методом)
  3. указатель получателя, что-то в получателе будет изменено в методе
0 голосов
/ 04 июня 2018

Вы должны вызвать метод для экземпляра его типа получателя.Таким образом, для метода, определенного в *Service, вы должны вызывать его для экземпляра *Service:

var foo *Service
foo = &Service{}
foo.InList(personID, personIDs)

Однако в вашем случае нет причин для этогобыть методом;похоже, он вообще не имеет ничего общего со своим получателем (он никогда не ссылается на него), так что это может быть просто обычная функция.Также обратите внимание, что в Go не указывается имя получателя this.

Я также настоятельно рекомендую хотя бы взять Go tour , который подробно описывает методы письма, с интерактивными примерами.

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