FakeItEasy утверждает, что вызов метода для метода - PullRequest
3 голосов
/ 14 апреля 2019

У меня есть модульный тест, написанный на FakeItEasy v2.2.0 .

Тест проверяет, что метод, пусть его вызовет MethodA вызов MethodB.

Простой класс:

public class Foo
{
    public virtual void MethodA()
    {
        MethodB();
    }

    public virtual void MethodB() { }
}

Простой тест:

var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());

foo_fake.MethodA();

A.CallTo(() => foo_fake.MethodA()).MustHaveHappened()
    .Then(A.CallTo(() => foo_fake.MethodB()).MustHaveHappened());

С FakeItEasy 2.2.0 , код передан.

Но когда мы обновляемся до 5.1.0 , возникает исключение кода, которое говорит:

Звонки были найдены, но не в правильном порядке среди звонков

Когда мы говорим , метод называется ? В начале исполнения или в конце?

Или, как правильно проверить этот случай?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

Обновление: это была ошибка, и она была исправлена. Начиная с FakeItEasy 5.1.1 , поведение восстанавливается до того, что было в 2.2.0


Мы записываем, что звонок был сделан после звонок закончен, поэтому в вашем случае заказ будет

  • выполнить метод A
  • выполнить метод B
  • запишите, что methodB произошел
  • запишите, что метод A произошел

Однако в 3.4.2 мы выпустили исправление для Установка значений аргумента ref маскирует значения входящего аргумента, используемые для проверки вызовов . Это переместило точку, в которой мы записываем «порядковый номер» вызова из CastleInvocationCallAdapter в FakeManager. Первый записал бы вызов methodA до вызова methodB.

Обидно, что это нарушает ваш сценарий использования. Я считаю, что новое поведение является ошибкой, и создал проблему # 1583 - Звонки записываются после применения лучшего правила, а не при получении на GitHub.

Лично я бы посмотрел на тест (который, я полагаю, более сложный, чем вы представили здесь). Я бы принял совет @ Никоси и не проверял порядок звонков. Зная, что они оба были призваны (или даже просто названы methodB), может быть достаточно.

2 голосов
/ 14 апреля 2019

Вызов MethodB происходит и завершается до завершения MethodA.Что объясняет сообщение заказа.Это (FakeItEasy) записи, вызываемые в конце вызова участника.

Чтобы доказать мою точку зрения, следующие тесты при прохождении теста

A.CallTo(() => foo_fake.MethodB()).MustHaveHappened() //<-- Note MethodB checked first
    .Then(A.CallTo(() => foo_fake.MethodA()).MustHaveHappened());

Я предлагаю следующее

//Arrange
var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());
Action<Foo> subject = foo => foo.MethodA();

//Act
subject(foo_fake);

//Assert
A.CallTo(() => foo_fake.MethodA()).MustHaveHappened();
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened();
...