FakeItEasy не проверяет вызов для теста Full Framework SignalR

У меня есть простой концентратор, для которого я пытаюсь написать тест с FakeItEasy, и проверка вызова клиента не проходит. У меня есть пример, работающий в отдельном проекте, который использует MOQ и XUnit.

public interface IScheduleHubClientContract
{
    void UpdateToCheckedIn(string id);
}

public void UpdateToCheckedIn_Should_Broadcast_Id()
{
    var hub = new ScheduleHub();
    var clients = A.Fake<IHubCallerConnectionContext<dynamic>>();
    var all = A.Fake<IScheduleHubClientContract>();

    var id= "123456789";
    hub.Clients = clients;

    A.CallTo(() => all.UpdateToCheckedIn(A<string>.Ignored)).MustHaveHappened();
    A.CallTo(() => clients.All).Returns(all);

    hub.UpdateToCheckedIn(id);
}

Я использую Fixie в качестве фреймворка для юнит-тестирования, и он сообщает:

FakeItEasy.ExpectationException:

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

Пример ниже работает в XUnit & MOQ:

    public interface IScheduleClientContract
    {
        void UpdateToCheckedIn(string id);

    }

    [Fact]
    public void UpdateToCheckedIn_Should_Broadcast_Id()
    {
        var hub = new ScheduleHub();
        var clients = new Mock<IHubCallerConnectionContext<dynamic>>();
        var all = new Mock<IScheduleClientContract>();
        hub.Clients = clients.Object;
        all.Setup(m=>m.UpdateToCheckedIn(It.IsAny<string>())).Verifiable();
        clients.Setup(m => m.All).Returns(all.Object);

        hub.UpdateToCheckedIn("id");

        all.VerifyAll();

    }

Я не уверен, что я пропустил в преобразовании?

1 ответ

Решение

Вы делаете некоторые шаги в странном (мне кажется, не видящем внутренностях ваших классов) порядке, и я считаю, что в этом проблема.

Я думаю, что ваша ключевая проблема в том, что вы пытаетесь проверить, что all.UpdateToCheckedIn должно быть, произошло еще до звонка hub.UpdateToCheckedIn, (Я не знаю наверняка, что hub.UpdateToCheckedIn звонки all.UpdateToCheckedIn, но это звучит разумно.

Есть еще одна проблема, где вы настраиваете clients.Setup возвращать all.Objectчто происходит после того, как вы утверждаете вызов all.UpdateToCheckedIn, Я не уверен, нужно ли это или нет, но подумал, что упомяну это.

Обычный порядок

  1. организовать подделки (и все, что вам нужно)
  2. действовать, но проверять тестируемую систему (hub)
  3. утверждать, что ожидаемые действия были предприняты на подделках (или любых других условиях, которые вы считаете необходимыми для успеха)

Я бы ожидал увидеть что-то более похожее

// Arrange the fakes
var all = A.Fake<IScheduleHubClientContract>();
var clients = A.Fake<IHubCallerConnectionContext<dynamic>>();
A.CallTo(() => clients.All).Returns(all); // if All has a getter, this could be clients.All = all

// … and arrange the system under test
var hub = new ScheduleHub();
hub.Clients = clients;

// Act, by exercising the system under test
var id = "123456789";
hub.UpdateToCheckedIn(id);

// Assert - verify that the expected calls were made to the Fakes
A.CallTo(() => all.UpdateToCheckedIn(A<string>.Ignored)).MustHaveHappened();
Другие вопросы по тегам