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

私の経験から、パラメーターとしてラムダを使用したモックは機能しません。等しいと考えられる式は、実際には等しくありません。

例えば:

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

に等しいとは見なされない

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

私の提案は、テスト用にリポジトリの偽物を作成するか、クエリを分離して統合テストでテストすることです。

こちらをご覧ください

リターンを得るためにできることは、次のようなものです

Where(Arg.Any<Expression<Func<Unit, bool>>>()).Returns(units);

ラムダ式のテストは、別の方法で行う必要があります。別のメソッドに分割してそのメソッドの統合テストを行うか、偽のリポジトリを作成してプラグインし、そのリポジトリにエンティティを挿入して取得します。

于 2013-03-04T14:31:24.397 に答える