C# 将模拟概念应用于实际单元测试时大脑冻结

C# 将模拟概念应用于实际单元测试时大脑冻结,c#,mocking,moq,C#,Mocking,Moq,我对单元测试和模拟的相关概念非常陌生。请原谅我的无知,如果这是一个愚蠢的问题,或者是我为理解这些概念而提出的例子。假设我有以下接口 public interface IMyService { OrderConfirmation ProcessOrder(Order order); } Order和OrderConfirmation类的定义如下 public class Order { public int OrderId { get; set; } public int

我对单元测试和模拟的相关概念非常陌生。请原谅我的无知,如果这是一个愚蠢的问题,或者是我为理解这些概念而提出的例子。假设我有以下接口

public interface IMyService
{
    OrderConfirmation ProcessOrder(Order order);
}
Order和OrderConfirmation类的定义如下

public class Order
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public List<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public int Price { get; set; }
}

public class OrderConfirmation
{
    public int OrderConfirmationId { get; set; }
    public int OrderId { get; set; }
    public Shipment ShipmentDetails { get; set; }
}

public class Shipment
{
    public int ShipmentId { get; set; }
    public DateTime ShipmentDate { get; set; }
    public int Cost { get; set; }
}
IDataProvider接口具有一系列从数据库存储/检索数据的操作

public interface IDataProvider

{
    List<Product> GetAllProducts();
    int CreateOrder(int customerId, List<Product> products);
    int CreateOrderConfirmation(int OrderConfirmationId, int orderId);
    void UpdateListOfAvailableProducts(List<Product> products);

}
公共接口IDataProvider
{
列出GetAllProducts();
int CreateOrder(int customerId,列出产品);
int-CreateOrderConfirmation(int-OrderConfirmationId,int-orderId);
作废更新产品(列出产品);
}

为了测试ProcessOrder方法,似乎我必须以某种方式模拟IDataProvider接口的所有方法,但我确实对如何提供模拟实现(使用)moq感到困惑。有人能给我举一些例子来说明如何做到这一点吗?

这里是许多假设的例子中的一个,数据提供者依赖关系的模拟是什么样子的。但是请注意,在没有看到测试方法的实际实现的情况下说些什么是非常模糊的。嗯

[TestMethod]
公共无效处理顺序\u当某些条件满足时\u某些预期结果()
{
//安排
OrderConfirmation expectedResult=new OrderConfirmation();//在此处设置预期结果
订单伪造请求=新订单();
List fakeProducts=新列表();
int fakeCreateOrderResult=123;
int fakeCreateOrderConfirmationResult=456;
//这是模拟依赖项
Mock dataProviderMock=new Mock();
//这里设置了该方法,因此它返回一些假冒产品
dataProviderLock.Setup(dp=>dp.GetAllProducts())
.退货(假冒产品);
//这里设置了该方法,因此它返回一些假结果
dataProviderLock.Setup(dp=>dp.CreateOrder(It.IsAny(),It.IsAny())
.返回(fakeCreateOrderResult);
//这里设置了该方法,因此它返回一些假结果
dataProviderLock.Setup(dp=>dp.CreateOrderConfirmation(It.IsAny(),It.IsAny())
.返回(fakeCreateOrderConfirmationResult);
//这里UpdateListOfAvailableProducts方法返回void so
//使用callback的一个例子是如何查看所提供的新产品列表
//可以更新现有的
DataProviderLock.Setup(dp=>dp.UpdateListOfAvailableProducts(
新列表{新产品{Price=100,ProductId=1,ProductName=“Product_X”}})
.Callback(np=>
{
假冒产品.添加范围(np);
});
//这是接收模拟数据提供程序对象的测试中的类
MyService service=newmyservice(dataProviderMock.Object);
//表演
//这里执行测试的方法
OrderConfirmation actualResult=service.ProcessOrder(FakereRequest);
//断言
//比较预期结果和实际结果
AreEqual(expectedResult.OrderId、actualResult.OrderId);
}   

显示测试中的方法,IDataProvider接口的执行方式。
public interface IDataProvider

{
    List<Product> GetAllProducts();
    int CreateOrder(int customerId, List<Product> products);
    int CreateOrderConfirmation(int OrderConfirmationId, int orderId);
    void UpdateListOfAvailableProducts(List<Product> products);

}
[TestMethod]
public void ProcessOrder_WhenSomeTestedCondition_ThenCertainExpectedResult()
{
    // Arrange
    OrderConfirmation expectedResult = new OrderConfirmation(); // Set expected result here
    Order fakeRequest = new Order();
    List<Product> fakeProducts = new List<Product>();
    int fakeCreateOrderResult = 123;
    int fakeCreateOrderConfirmationResult = 456;

    // This is the mocked dependency
    Mock<IDataProvider> dataProviderMock = new Mock<IDataProvider>();

    // Here the method is setup so it returns some fake products
    dataProviderMock.Setup(dp => dp.GetAllProducts())
        .Returns(fakeProducts);

    // Here the method is setup so it returns some fake result
    dataProviderMock.Setup(dp => dp.CreateOrder(It.IsAny<int>(), It.IsAny<List<Product>>()))
        .Returns(fakeCreateOrderResult);

    // Here the method is setup so it returns some fake result
    dataProviderMock.Setup(dp => dp.CreateOrderConfirmation(It.IsAny<int>(), It.IsAny<int>()))
        .Returns(fakeCreateOrderConfirmationResult);

    // Here the method UpdateListOfAvailableProducts returns void so
    // an example using callback is shouwing how the provided list of new products
    // could update the existing ones
    dataProviderMock.Setup(dp => dp.UpdateListOfAvailableProducts(
        new List<Product> { new Product {Price = 100, ProductId = 1, ProductName = "Product_X"}}))
        .Callback<List<Product>>(np =>
        {
            fakeProducts.AddRange(np);
        });

    // This is class under test which receives the mocked data provider object
    MyService service = new MyService(dataProviderMock.Object);

    // Act
    // Here the tested method is executed
    OrderConfirmation actualResult = service.ProcessOrder(fakeRequest);

    // Assert
    // Compare expected and actual results
    Assert.AreEqual(expectedResult.OrderId, actualResult.OrderId);
}