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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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# 有没有办法在服务中模拟(使用Moq)服务并执行代码?_C#_Unit Testing_Integration Testing_Moq - Fatal编程技术网

C# 有没有办法在服务中模拟(使用Moq)服务并执行代码?

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

我有一个使用Moq的测试问题。我到处都找过了,但我不太明白到底发生了什么事

我想测试一个名为Basket的类(服务),在该类中我作为DI传递给另一个类(服务)折扣服务

我所面临的问题是,每当我模拟Basket类时,它都能很好地触发,但当它到达实际执行折扣服务中另一个方法的代码时,它只是跳过该方法,而不是进入。我做错了什么

我想可能是因为我没有正确地进行设置

以下是我到目前为止的实际测试代码:

[测试]
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

}