Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fakeitesy未验证对完整框架信号器测试的调用_C#_Asp.net Mvc_Unit Testing_Signalr_Fakeiteasy - Fatal编程技术网

C# Fakeitesy未验证对完整框架信号器测试的调用

C# Fakeitesy未验证对完整框架信号器测试的调用,c#,asp.net-mvc,unit-testing,signalr,fakeiteasy,C#,Asp.net Mvc,Unit Testing,Signalr,Fakeiteasy,我有一个简单的集线器,我正试图用Fakeitesy为它编写一个测试,调用客户机的验证没有通过。我在一个单独的项目中使用了MOQ和XUnit public interface IScheduleHubClientContract { void UpdateToCheckedIn(string id); } public void UpdateToCheckedIn_Should_Broadcast_Id() { var hub = new ScheduleHub(); v

我有一个简单的集线器,我正试图用Fakeitesy为它编写一个测试,调用客户机的验证没有通过。我在一个单独的项目中使用了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);
}
公共接口是ScheduleHubclientContract
{
void UpdateToCheckedIn(字符串id);
}
public void UpdateToCheckedIn\u应该\u广播\u Id()
{
var hub=新的ScheduleHub();
var clients=A.Fake();
var all=A.Fake();
var id=“123456789”;
hub.Clients=客户;
A.CallTo(()=>all.UpdateToCheckedIn(A.Ignored)).musthaveOccessed();
A.CallTo(()=>clients.All).Returns(All);
hub.UpdateToCheckedIn(id);
}
我使用Fixie作为单元测试框架,它报告:

FakeiTesy.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();

    }
公共接口是ScheduleClientContract
{
void UpdateToCheckedIn(字符串id);
}
[事实]
public void UpdateToCheckedIn\u应该\u广播\u Id()
{
var hub=新的ScheduleHub();
var clients=newmock();
var all=new Mock();
hub.Clients=Clients.Object;
all.Setup(m=>m.UpdateToCheckedIn(It.IsAny()).Verifiable();
clients.Setup(m=>m.All).Returns(All.Object);
hub.UpdateToCheckedIn(“id”);
all.VerifyAll();
}

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

你正在以一种奇怪的顺序(在我看来,没有看到你的类的内部)进行一些步骤,我相信这就是问题所在

我认为您的关键问题是,您试图在调用
hub.UpdateToCheckedIn
之前验证
all.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();
    
    //整理赝品
    var all=A.Fake();
    var clients=A.Fake();
    A.CallTo(()=>clients.All).Returns(All);//如果All有一个getter,则可能是clients.All=All
    //…并安排正在测试的系统
    var hub=新的ScheduleHub();
    hub.Clients=客户;
    //通过运行被测系统来采取行动
    var id=“123456789”;
    hub.UpdateToCheckedIn(id);
    //断言-验证预期的调用是否是针对伪造的
    A.CallTo(()=>all.UpdateToCheckedIn(A.Ignored)).musthaveOccessed();
    
    我认为Moq中的
    .Verifiable()
    不会立即验证调用,它只是指示在调用
    VerifyAll
    时应该验证调用。(顺便说一句,我有点喜欢这种方法,也许我们应该在fakeitesy中添加类似的内容;这样可以避免重复调用规范)@ThomasLevesque,关于Moq的
    .Verifiable
    的工作原理,你是对的。说实话,我不喜欢它。我理解人们为什么喜欢权宜之计,但我喜欢知道在哪里查找断言的明确性。如果人们愿意,他们总是可以将规范保存到变量中。还要注意,在Moq示例中,有Actuallly没有重用-
    all.Setup
    是可验证的,但没有配置的行为,如果我读对了的话。但是我很高兴争论这是否是一个在Fakeetisy回购中添加的好功能!啊,所以你不会喜欢我刚刚打开的问题;)啊。。。太简单了,喜欢它!事实正是如此。我只是一行一行地复制我的MOQ代码。。。但没有考虑可验证/验证的所有内容。这就是我得到的。我知道这很简单。脑死亡时刻,我们都明白了。:-)MOQ代码是MS在单元测试信号器集线器上的样本的直接样本,我在巡航控制上比平时更多(周五,一天结束……哈哈)。@BlairConrad-Love Fakeetisy btw!!!!:-)在我看来,阅读/理解要容易得多。。。