c# - FakeItEasy 不验证完整框架 SignalR 测试的调用

标签 c# asp.net-mvc unit-testing signalr fakeiteasy

我有一个简单的集线器,我正在尝试使用 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();

    }

我不确定我在转换过程中遗漏了什么?

最佳答案

您正在执行一些奇怪的步骤(在我看来,没有看到您的类的内部结构)顺序,我相信这就是问题所在。

我认为您的关键问题是您试图验证 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();

关于c# - FakeItEasy 不验证完整框架 SignalR 测试的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51904257/

相关文章:

angular - 测试 Angular 组件时 NgZone 未定义

javascript - Jasmine 监视嵌套对象

c# - Entity Framework Core - 非线程安全 - ServiceLifetime.Transient

c# - 如何在不依赖公共(public)数据上下文实例的情况下保持相关实体之间的引用透明性?

c# - 序列化不接受不同的命名空间。为什么?

c# - asp.net MVC 是否有应用程序变量?

java - 如何在 groovy spock 测试中返回模拟列表

c# - 方法 "do"在等待空任务时有何作用?

c# - Azure 上具有 ClickOnce 应用程序的 Asp.net MVC 网站

c# - 复杂密码的正则表达式