1

我正在使用 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 中的计数,它仍然返回零。谁能告诉我我做错了什么。

提前致谢

4

2 回答 2

1

要设置模拟,您需要编写类似

transportServiceMock
    .Setup(ts => ts.GetUnits(It.IsAny<Func<Unit, bool>>(), It.IsAny<int>()))
    .Returns(units);
于 2013-03-04T17:48:15.850 回答
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 表达式的测试必须以另一种方式进行。要么将其分离为单独的方法并集成测试该方法,要么创建一个您插入的假存储库并将实体插入该存储库以从中获取。

于 2013-03-04T14:31:24.397 回答