Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 如何验证调用了方法?_C#_Unit Testing_Moq_Autofixture - Fatal编程技术网

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它可能应该。。。