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);
}