Asp.net mvc 模拟安装程序未按预期工作
我正在使用NUnit测试我的应用程序,方法如下Asp.net mvc 模拟安装程序未按预期工作,asp.net-mvc,nunit,Asp.net Mvc,Nunit,我正在使用NUnit测试我的应用程序,方法如下 public int POCRemainingUnits() { var units = _transportService.GetUnits(x => x.Shipment.Id == shipmentId && x.POCAllowed == true && x.IsPOC == false, 0); int POCUnitCount = units.C
public int POCRemainingUnits()
{
var units = _transportService.GetUnits(x => x.Shipment.Id == shipmentId && x.POCAllowed == true && x.IsPOC == false, 0);
int POCUnitCount = units.Count();
//
//
}
我的测试方法是
[Test]
public void Invoke_POCUnitCommand_As_Many_Times_As_Number_Of_Remaining_Units_With_Valid_Input()
{
//arrange
var unit1 = new Unit { IsPOC = false, POCAllowed = true };
var unit2 = new Unit { IsPOC = false, POCAllowed = true };
IQueryable<Unit> units = (new Unit[] { unit1, unit2 }).AsQueryable();
_transportServiceMock.Setup(y => y.GetUnits(x => x.Shipment.Id == 1 && x.POCAllowed == true && x.IsPOC == false, 0)).Returns(units);
//
//
}
[测试]
public void调用\u POCUnitCommand \u作为\u多次\u作为\u剩余\u单元的数量\u使用\u有效\u输入()
{
//安排
var unit1=新单元{IsPOC=false,poclowed=true};
var unit2=新单元{IsPOC=false,poclowed=true};
IQueryable units=(新单元[]{unit1,unit2}).AsQueryable();
_transportServiceMock.Setup(y=>y.GetUnits(x=>x.shipping.Id==1&&x.poclowed==true&&x.IsPOC==false,0))。返回(单位);
//
//
}
但是它失败了,因为它没有设置GetUnits方法。如果我在POCRemainingUnits中检查计数,它仍然返回零。有人能告诉我我做错了什么吗
提前感谢根据我的经验,用lambdas作为参数进行模拟是行不通的。我们认为相等的表达式实际上并不相等 例如:
[whatever].Where(x=>x.ShipmentId == 3);
不被视为等同于
id = 3;
[whatever].Where(x=>x.ShipmentId == id);
我的建议是要么伪造存储库进行测试,要么隔离查询并使用集成测试进行测试
你可以做些什么来获得回报
Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);
transportServiceMock
.Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
.Returns(units);
Where(Arg.Any())。返回(单位);
对lambda表达式的测试必须以另一种方式进行。或者将其分离到一个单独的方法中,并集成测试该方法,或者创建一个您插入的假存储库,并将实体插入该存储库中以从中获取。根据我的经验,以lambdas作为参数进行模拟是行不通的。我们认为相等的表达式实际上并不相等 例如:
[whatever].Where(x=>x.ShipmentId == 3);
不被视为等同于
id = 3;
[whatever].Where(x=>x.ShipmentId == id);
我的建议是要么伪造存储库进行测试,要么隔离查询并使用集成测试进行测试
你可以做些什么来获得回报
Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);
transportServiceMock
.Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
.Returns(units);
Where(Arg.Any())。返回(单位);
对lambda表达式的测试必须以另一种方式进行。或者将其分离到一个单独的方法中并集成测试该方法,或者创建一个您插入的假存储库,并将实体插入该存储库中以从中获取。要设置mock,您需要编写以下代码
Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);
transportServiceMock
.Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
.Returns(units);
transportServiceMock
.Setup(ts=>ts.GetUnits(It.IsAny(),It.IsAny())
.申报表(单位);
要设置mock,您需要编写如下代码
Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);
transportServiceMock
.Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
.Returns(units);
transportServiceMock
.Setup(ts=>ts.GetUnits(It.IsAny(),It.IsAny())
.申报表(单位);
Hi,即使我尝试了[whatever].Where(x=>x.ShipmentId==It.IsAny())之类的东西,也没有设置。。!!不,不会的。工作原理类似于Where(Arg.Any)。返回(units)Hi,即使我尝试使用[whatever].Where(x=>x.ShipmentId==It.IsAny())之类的东西,但它也没有设置。。!!不,不会的。起作用的是Where(Arg.Any).Returns(units)