模拟安装程序无法正常工作

时间:2013-03-04 14:27:11

标签: 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.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中的计数,它仍然返回零。任何人都可以告诉我我做错了什么。

提前致谢

2 个答案:

答案 0 :(得分:0)

根据我的经验,使用lambdas作为参数进行模拟是行不通的。我们认为平等的表达实际上并不相同。

例如:

[whatever].Where(x=>x.ShipmentId == 3);

不等于

id = 3;
[whatever].Where(x=>x.ShipmentId == id);

我的建议是假冒你的存储库进行测试,或隔离查询并用集成测试对它们进行测试。

See here

你可以做什么来获得回报就像

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);