FakeItEasy 不验证完整框架 SignalR 测试的调用
FakeItEasy not verifying call for Full Framework SignalR test
我有一个简单的集线器,我正在尝试使用 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 和最小起订量:
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();
}
我不确定我在转换中遗漏了什么?
您正在执行一些奇怪的步骤(在我看来,没有看到您 类 的内部结构)命令,我相信这就是问题所在。
我认为您的关键问题是您试图在调用 hub.UpdateToCheckedIn
之前验证 all.UpdateToCheckedIn
一定已经发生。 (我不确定 hub.UpdateToCheckedIn
调用 all.UpdateToCheckedIn
,但听起来很合理。
还有另一个问题,您将 clients.Setup
配置为 return 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();
我有一个简单的集线器,我正在尝试使用 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 和最小起订量:
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();
}
我不确定我在转换中遗漏了什么?
您正在执行一些奇怪的步骤(在我看来,没有看到您 类 的内部结构)命令,我相信这就是问题所在。
我认为您的关键问题是您试图在调用 hub.UpdateToCheckedIn
之前验证 all.UpdateToCheckedIn
一定已经发生。 (我不确定 hub.UpdateToCheckedIn
调用 all.UpdateToCheckedIn
,但听起来很合理。
还有另一个问题,您将 clients.Setup
配置为 return 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();