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
, Я не уверен, нужно ли это или нет, но подумал, что упомяну это.
Обычный порядок
- организовать подделки (и все, что вам нужно)
- действовать, но проверять тестируемую систему (
hub
) - утверждать, что ожидаемые действия были предприняты на подделках (или любых других условиях, которые вы считаете необходимыми для успеха)
Я бы ожидал увидеть что-то более похожее
// 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();