我正在使用NUnit以方法
来测试我的应用程序 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);
//
//
}
但它失败了,因为它没有设置GetUnits方法。如果我检查POCRemainingUnits中的计数,它仍然返回零。任何人都可以告诉我我做错了什么。
提前致谢
答案 0 :(得分:0)
根据我的经验,使用lambdas作为参数进行模拟是行不通的。我们认为平等的表达实际上并不相同。
例如:
[whatever].Where(x=>x.ShipmentId == 3);
不等于
id = 3;
[whatever].Where(x=>x.ShipmentId == id);
我的建议是假冒你的存储库进行测试,或隔离查询并用集成测试对它们进行测试。
你可以做什么来获得回报就像
Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);
您对lambda表达式的测试必须以另一种方式进行。将其分成单独的方法并对该方法进行集成测试,或者创建一个虚拟的存储库,插入并将实体插入该存储库以便从中获取。
答案 1 :(得分:0)
要设置模拟,您需要编写类似
的内容transportServiceMock
.Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
.Returns(units);