Проверить порядок вызова моков - PullRequest
0 голосов
/ 05 августа 2020

Я использую testify (v1.6.1), и мне нужно проверить , если методы интерфейсов вызывают в правильном порядке. Я проверил документацию и попытался найти какую-либо информацию в inte rnet, но ничего не нашел о проверке имитационного порядка.

Пример:

type InterfaceA interface {
    Execute()
}

type InterfaceB interface {
    Execute()
}
type Composition struct {
    a InterfaceA
    b InterfaceB
}

func (c * Composition) Apply() error {
    //How to check that "a" execute before "b"?
    c.a.Execute()
    c.b.Execute()
    return nil
}

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Это напрямую не поддерживается, даже если есть открытая проблема ( stretchr / testify / issue 741 «assert mock calls in order» )

Более общая проблема 684 «Утвердить порядок вызова?» включает опровержение:

ИМО, вы должны проверить вывод функции, но не то, как она работает внутри. Это может привести к тестовой реализации, которую очень сложно поддерживать.

Хотя в том же потоке:

ИМО, есть случаи, чтобы обеспечить соблюдение порядка. то есть если вы имитируете мьютекс, вам лучше проверить, что Lock всегда вызывался перед Unlock. У нас может быть простая реализация, в которой макет имеет флаг «assertExpectationsInOrder» true / false, который может быть установлен перед добавлением любых ожиданий.

Это может привести к некоторому тесту, например cassandra-operator/cmd/operator/controller_test.go, который записывает события для проверки своих заказов.

0 голосов
/ 06 августа 2020

Как говорили другие, это внутренняя деталь, которая действительно связывает ваше тестирование с реализацией. Это ничего не значит, если вы определили, что порядок имеет значение. Краткое описание - еще одно решение, использующее минимум для порядка тестирования.

Создайте двух шпионов, реализующих InterfaceA и InterfaceB.

type SpyA struct {
    Calls *[]string
}

func (s *SpyA) Execute() {
    *s.Calls = append(*s.Calls, "ExecuteA")
}

type SpyB struct {
    Calls *[]string
}

func (s *SpyB) Execute() {
    *s.Calls = append(*s.Calls, "ExecuteB")
}

Затем используйте их вот так.

func TestApply(t *testing.T) {
    got := []string{}
    c := &Composition{
        a: &SpyA{&got},
        b: &SpyB{&got},
    }

    c.Apply()

    expected := []string{"ExecuteA", "ExecuteB"}

    if len(got) != len(expected) {
        t.Fail()
    }

    for i := range got {
        if got[i] != expected[i] {
            t.Fail()
        }
    }
}

Детская площадка

0 голосов
/ 05 августа 2020

ИМО, есть случаи принудительного исполнения. то есть, если вы имитируете мьютекс, вам лучше проверить, что Lock всегда вызывался перед Unlock. 1009 * при наличии причин можно усложнить лог проверки заказа c ...

...