C# Fakeitesy未验证对完整框架信号器测试的调用
我有一个简单的集线器,我正试图用Fakeitesy为它编写一个测试,调用客户机的验证没有通过。我在一个单独的项目中使用了MOQ和XUnitC# 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
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!!!!:-)在我看来,阅读/理解要容易得多。。。