C# 如何验证调用了方法?
我有一个C# 如何验证调用了方法?,c#,unit-testing,moq,autofixture,C#,Unit Testing,Moq,Autofixture,我有一个ICreateService类,它依赖于iticketapidapter。我试着注册一个模拟的ITicketAdaper,这样当我创建一个匿名创建服务时,它就会被注入 因此,在设置中,我为票证适配器设置了以下寄存器: Fixture.Register(() => { var ticketApiAdapter = new Mock<ITicketApiAdapter>(); ticketApiAdapter
ICreateService
类,它依赖于iticketapidapter
。我试着注册一个模拟的ITicketAdaper,这样当我创建一个匿名创建服务时,它就会被注入
因此,在设置中,我为票证适配器设置了以下寄存器:
Fixture.Register(() =>
{
var ticketApiAdapter = new Mock<ITicketApiAdapter>();
ticketApiAdapter
.Setup( x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()))
.Returns(new SaveResult
{
Success = true,
Id = Fixture.CreateAnonymous<Guid>().ToString()
});
return ticketApiAdapter;
});
Fixture.Register(() => new CreateService(Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>().Object));
我希望apiTicketAdapter是我注册的,这样我就可以验证方法是否被调用。如果我通过,TicketAppiaDapter会被调用,但Moq说不是
编辑
这是我得到的错误:
CreateServiceCallsAddTicketComment引发异常:
Moq.MockException:预期对模拟调用一次,但为0
times:x=>x.AddTicketComment(It.IsAny(),It.IsAny(),
It.IsAny())
配置的设置:x=>x.AddTicketComment(It.IsAny(),
It.IsAny(),It.IsAny()),时代。永远不会
执行的调用
注册代码块时,每次Fixture实例解析请求的类型时都会调用该代码块。这意味着它没有冻结。如果你想冷冻东西,其中一种方法通常更容易使用 更好的是,既然您似乎正在使用最小起订量,我可以建议您使用吗 这将使您能够将测试重写为以下内容:
[TestMethod]
public void CreateServiceCallsAddTicketComment()
{
var apiTicketAdapter = Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>();
var createTicketRequest = Fixture.CreateAnonymous<CreateTicketComment>();
var createService = Fixture.CreateAnonymous<CreateService>();
var results = createService.CreateTicketComment(createTicketRequest);
apiTicketAdapter
.Verify(x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()),
Times.Once());
Assert.IsTrue(results.All(x => x.Success));
Assert.IsTrue(results.All(x => x.Errors.Count == 0));
}
[TestMethod]
public void CreateServiceCallsAddTicketComment(new AutoMoqCustomization());
{
var fixture = new Fixture().Customize()
var apiTicketAdapter = fixture.Freeze<Mock<ITicketApiAdapter>>();
ticketApiAdapter
.Setup( x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()))
.Returns(new SaveResult
{
Success = true,
Id = Fixture.CreateAnonymous<Guid>().ToString()
});
var createTicketRequest = fixture.Freeze<CreateTicketComment>();
var createService = fixture.CreateAnonymous<CreateService>();
var results = createService.CreateTicketComment(createTicketRequest);
apiTicketAdapter
.Verify(x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()),
Times.Once());
Assert.IsTrue(results.All(x => x.Success));
Assert.IsTrue(results.All(x => x.Errors.Count == 0));
}
[TestMethod]
public void CreateServiceCallsAdticketComment(新的AutoMoqCustomization());
{
var fixture=new fixture().Customize()
var apiTicketAdapter=fixture.Freeze();
票务助理
.Setup(x=>x.AddTicketComment(
It.IsAny(),
It.IsAny(),
It.IsAny())
.Returns(新的SaveResult)
{
成功=正确,
Id=Fixture.CreateAnonymous().ToString()
});
var createTicketRequest=fixture.Freeze();
var createService=fixture.CreateAnonymous();
var results=createService.CreateTicketComment(createTicketRequest);
蜂鸣器
.验证(x=>x.AddTicketComment(
It.IsAny(),
It.IsAny(),
It.IsAny()),
倍。一次();
Assert.IsTrue(results.All(x=>x.Success));
Assert.IsTrue(results.All(x=>x.Errors.Count==0));
}
这是假设CreateTicketRequest使用构造函数注入或属性注入。它显示的Moq的确切消息是什么?@Serghei添加了AddTicketComment()方法的错误消息AddCode,请在第一块代码中。这只是一个返回良好结果的模拟。我不明白为什么您希望在x中调用方法AddTicketComment()。AddTicketComment()如果您根本不在该方法中调用它,您就没有我正确理解的CreateService的实现。正如我在CreateService类中所理解的,您应该有方法x.AddTicketComment(),并且这个方法应该调用AddTicketComment()?你能展示CreateService的实现吗?谢谢Mark。我一直在读你的博客,但我似乎无法完全了解AutoFixture/AutoMoq的功能。简单的测试似乎很容易,但完整的设置是我所缺乏的。我希望能够设置
apiTicketAdapter
一次,然后测试CreateService
中的所有方法调用适配器上的不同方法。如果我在[TestSetup]
中释放了票证适配器,我可以在每个[TestMehtod]
中使用Freeze来获取相同的实例以验证是否调用了某个方法吗?通过尝试回答了我自己的问题;)它似乎达到了我的预期。另一方面,当我试图通过谷歌搜索结果访问你的博客时,它每次都会使Chrome崩溃。你的代码示例的第6行,应该是apitecketadaptor
,而不是ticketapaptor
?@OutstandingBill它可能应该。。。