C# 有没有办法在服务中模拟(使用Moq)服务并执行代码?
我有一个使用Moq的测试问题。我到处都找过了,但我不太明白到底发生了什么事 我想测试一个名为Basket的类(服务),在该类中我作为DI传递给另一个类(服务)折扣服务 我所面临的问题是,每当我模拟Basket类时,它都能很好地触发,但当它到达实际执行折扣服务中另一个方法的代码时,它只是跳过该方法,而不是进入。我做错了什么 我想可能是因为我没有正确地进行设置 以下是我到目前为止的实际测试代码:C# 有没有办法在服务中模拟(使用Moq)服务并执行代码?,c#,unit-testing,integration-testing,moq,C#,Unit Testing,Integration Testing,Moq,我有一个使用Moq的测试问题。我到处都找过了,但我不太明白到底发生了什么事 我想测试一个名为Basket的类(服务),在该类中我作为DI传递给另一个类(服务)折扣服务 我所面临的问题是,每当我模拟Basket类时,它都能很好地触发,但当它到达实际执行折扣服务中另一个方法的代码时,它只是跳过该方法,而不是进入。我做错了什么 我想可能是因为我没有正确地进行设置 以下是我到目前为止的实际测试代码: [测试] public async System.Threading.Tasks.Task Test1A
[测试]
public async System.Threading.Tasks.Task Test1Async()任务
{
//安排
var basketServiceMock=new Mock();
var discountServiceMock=new Mock();
列表产品模型=
新名单
{
新BasketProductModel()
{
ProductName=“牛奶”,
ProductPrice=10,
数量=3
}
};
篮模型篮=新篮模型{产品=产品模型};
basketServiceMock.Setup(x=>x.Baskett)
.Returns(新的BasketModel{Products=productsModel});
var product=新的BasketProductModel()
{
ProductName=“牛奶”,
ProductPrice=10,
数量=1
};
var product1=新的BasketProductModel()
{
ProductName=“牛奶”,
ProductPrice=10,
数量=1
};
var product2=新的BasketProductModel()
{
ProductName=“牛奶”,
ProductPrice=10,
数量=1
};
var product3=新的BasketProductModel()
{
ProductName=“牛奶”,
ProductPrice=10,
数量=1
};
折扣ServiceMock.Setup(x=>x.ApplyDiscount(参考篮子,产品));
var basketService=new Basket.Basket(折扣服务mock.Object);
//表演
等待篮子服务。添加产品到篮子(产品);
等待篮筐服务。添加ProductToBasket(product1);
等待篮子服务。添加产品到篮子(产品2);
等待篮子服务。添加产品到篮子(产品3);
//断言
}
这是我的篮球课:
公共类篮子:IBasket
{
私人篮球模型(篮球产品),;
私人双重成本;
公共篮子模型
得到{
如果(_basketProducts==null)
抛出新的ArgumentNullException(“XXXXXXXXX”);
退货(篮类产品);;
}
}
公共双重总成本
{
收到
{
如果(_totalCost==null)
{
抛出新的ArgumentNullException(“XXXXXXXXX”);
}
返回-总成本;
}
}
私人只读IDisontService(折扣服务);
公共购物篮(IDiscountService折扣服务)
{
_折扣服务=折扣服务;
_basketProducts=新BasketModel();
_basketProducts.Products=新列表();
}
公共异步任务AddProductToBasket(BasketProductModel产品)
{
如果(产品==null)
抛出新ArgumentNullException();
var obj=\u basketProducts.Products.FirstOrDefault(x=>x.ProductName==product.ProductName);
if(obj==null)
_篮子产品.产品.添加(产品);
其他的
{
对象数量+=产品数量;
}
_折扣服务。ApplyDiscount(参考basketProducts,product);0)
产品.计算结果(篮子);
}
}
这是BasketProductModel(篮子内的产品)
公共类BasketProductModel:折扣流程
{
公共篮子产品模型()
{
初始(本);
}
公共字符串ProductName{get;set;}
公共双产品价格{get;set;}
公共整数;
public int Freebies{get;set;}
公共双总计{get;set;}
}
这是在上面的类中使用的抽象类,用于使用一些预配置的实现
公共抽象类折扣过程
{
私有BasketProductModel_obj{get;set;}
公共篮子产品模型Obj
{
收到
{//check\u obj已初始化:
如果(_obj==null)抛出新异常();
返回对象;
}
}
受保护的void Init(BasketProductModel bPModel)
{
_obj=BPM模型;
}
公共空间计算搜索(篮模型篮)
{
var PRODUCTCONTAIND=产品篮的数量(参考篮,_obj);
var obj=basket.Products.FirstOrDefault(x=>x.ProductName==\u obj.ProductName);
var freeItems=0;
交换机(\u obj.ProductName)
{
案例“牛奶”:
如果(产品包含%2!=0)
{
obj.免费赠品=免费物品的数量(obj.数量);
//添加数量(参考obj);
}
打破
“黄油”一案:
打破
案例“面包”:
productContained=NumberOfProductsInBasket(参考basket,产品名称:“黄油”);
如果(含%)
//...
//Arrange
var basketServiceMock = new Mock<IBasket>(); //<-- Should not be mocked
var discountServiceMock = new Mock<IDiscountService>();
//...
var discountServiceMock = new Mock<IDiscountService>();
Basket basketServiceMock = new Basket(discountServiceMock .Object);
//...
[Test]
public async System.Threading.Tasks.Task Test1Async() {
//Arrange
var discountServiceMock = new Mock<IDiscountService>();
Basket subject = new Basket(discountServiceMock.Object);
List<BasketProductModel> productsModel = new List<BasketProductModel> {
new BasketProductModel() {
ProductName = "Milk",
ProductPrice = 10,
Quantity = 3
}
};
subject.Baskett.Products = productsModel;
// Only matches if the ref argument to the invocation is the same instance
discountServiceMock
.Setup(x => x.ApplyDiscount(ref subject.Baskett, It.IsAny<BasketProductModel>()));
//You need to decide what you want the mocked member to do.
var product = new BasketProductModel() {
ProductName = "Milk",
ProductPrice = 10,
Quantity = 1
};
var product1 = new BasketProductModel() {
ProductName = "Milk",
ProductPrice = 10,
Quantity = 1
};
var product2 = new BasketProductModel() {
ProductName = "Milk",
ProductPrice = 10,
Quantity = 1
};
var product3 = new BasketProductModel() {
ProductName = "Milk",
ProductPrice = 10,
Quantity = 1
};
//Act
await subject.AddProductToBasket(product);
await subject.AddProductToBasket(product1);
await subject.AddProductToBasket(product2);
await subject.AddProductToBasket(product3);
//Assert
//...You need to decide what it is you are actually testing
//and want to assert
}