如何使用It.IsAny <>TValue匹配对象的某些属性?

如何解决如何使用It.IsAny <>TValue匹配对象的某些属性?

考虑以下代码。它具有BookingRequest,其中包含两个属性。接口IBookingRequestProcessor具有处理BookingRequest方法。我想创建一个模拟,该模拟将匹配所有与一个属性匹配的BookingRequest对象,而其他属性可以是任何值。

为此,我创建了模拟匹配对象,其匹配属性设置为我要匹配的值,其他属性设置为It.IsAny<>()。但是,我得到Moq.MockException的原因是All invocations on the mock must have a corresponding setup.

完整的代码如下:

using System;
using Moq;

public class Program {

    public class BookingRequest
    {
        public string FlightId { get; set; }
        public string BookingId { get; set; }

        public BookingRequest() { }

        public BookingRequest(string FlightId,string BookingId)
        {
            this.FlightId = FlightId;
            this.BookingId = BookingId;
        }
    }

    public interface IBookingRequestProcessor
    {
        string ConstantReturn(string param);

        int ProcessBooking(BookingRequest bookingRequest);
    }
    
    public static void Main(String[] args) {
        var bookingRequestMock = new Mock<IBookingRequestProcessor>(MockBehavior.Strict);

        bookingRequestMock
            .Setup(bp => bp.ConstantReturn(It.IsAny<string>()))
            .Returns("AB");

        Console.WriteLine(bookingRequestMock.Object.ConstantReturn(Guid.NewGuid().ToString()));

        Console.WriteLine("----");

        var bookingRequestMatcher = new BookingRequest()
        {
            FlightId = "AB495",BookingId = It.IsAny<string>()
        };

        bookingRequestMock
            .Setup(bp => bp.ProcessBooking(bookingRequestMatcher))
            .Returns(495);

        var bookingRequest = new BookingRequest("AB495",Guid.NewGuid().ToString());
        Console.WriteLine(bookingRequest.FlightId + " --> " + bookingRequestMock.Object.ProcessBooking(bookingRequest));
    }
}

解决方法

模拟对象属性的匹配必须通过Is<TValue>()处理。您可以通过以下方式根据所需属性进行匹配:

bookingRequestMock
    .Setup(bp => bp.ProcessBooking(It.Is<BookingRequest>(br => br.FlightId == "AB495")))
    .Returns(495);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?