0

データベースからデータを取得する関数に次のコードがあります。

var oldFareSpecification = new ObservationOnOrBeforeDateSpecification(previousOutboundDate));

var oldFare = _fareRepository.Find(oldFareSpecification).SingleOrDefault();

仕様は次のとおりです。

public class ObservationOnOrBeforeDateSpecification : Specification<Fare>
    {
        public ObservationOnOrBeforeDateSpecification(DateTime date)
        : base(fh => EntityFunctions.DiffDays(fh.ObservationTS, date) >= 0)
    {
    }
    }

System.Data.Entity を使用します。
リポジトリは

Repository<TEntity> : IRepository<TEntity>
private readonly DbContext _context;
        private readonly DbSet<TEntity> _entitySet;
public IEnumerable<TEntity> Find(ISpecification<TEntity> criteria)
        {
            return criteria.SatisfyingEntitiesFrom(_entitySet).AsEnumerable();
        }

それは正常に動作しますが、テスト クラスで Moq リポジトリにアクセスしようとして、偽のオブジェクトに対するクエリの結果を返すリポジトリを呼び出すと、例外が発生します。他の言語で: p)。

私のテストクラスは、データベースがこのように偽の結果を返すようにします:

var faresRepository = Fixture.Freeze<Mock<IRepository<DAL.Fare>>>();
faresRepository.Setup(
                fhr => fhr.Find(It.IsAny<ISpecification<Fare>>())).Returns(
                (ISpecification<Fare> spec) => spec.SatisfyingEntitiesFrom(fares.AsQueryable()));

そして今、私の質問は、日数の違いを比較し、コードから正常に呼び出され、モックされたリポジトリで正常に動作する仕様をどのようにコーディングできるかです。ここで言う正しい比較とは、2013.01.16 23:55:34 と 2013.01.17 01:55:34 の日数差は 1 を返すということです。

4

1 に答える 1

0

解決:

** これを行う唯一の方法は、特定のメソッド (ここでは .Find) が呼び出されるたびに偽の結果を返すキューを作成することです。まさに私が達成したいことではありませんが、少なくとも機能します。だからここにあります:

    var faresHistoryRepository = Fixture.Freeze<Mock<IRepository<DAL.FareHistory>>>();

    var fareHistoryResults = new Queue<List<FareHistory>>();

    var fareHistories = new List<DAL.FareHistory>();
    FareHistory fh1 = new FareHistory { FareHistoryId = fareHistoryId + 1, FareId = fareId, ObservationTS = date.AddDays(-1), StatusId = (int)DAL.Enum.Status.Active };
    fareHistories.Add(fh1);
    fh1 = new FareHistory { FareHistoryId = fareHistoryId + 4, FareId = fareId, ObservationTS = date.AddDays(-4), StatusId = (int)DAL.Enum.Status.Active };
    fareHistories.Add(fh1);
    fh1 = new FareHistory { FareHistoryId = fareHistoryId + 5, FareId = fareId, ObservationTS = date.AddDays(-5), StatusId = (int)DAL.Enum.Status.Active };
    fareHistories.Add(fh1);
    fareHistoryResults.Enqueue(fareHistories); // fare histories

    var fareHistoriesSample = new List<DAL.FareHistory>();
    fh1 = new FareHistory { FareHistoryId = fareHistoryId + 6, FareId = oldFareId,
 ObservationTS = depDate.AddDays(-fullDaysDifference), StatusId = (int)DAL.Enum.Status.Active };
    fareHistoriesSample.Add(fh1);
        fh1 = new FareHistory { FareHistoryId = fareHistoryId + 7, FareId = oldFareId,
     ObservationTS = depDate.AddDays(-15), StatusId = (int)DAL.Enum.Status.Active };
        fareHistoriesSample.Add(fh1);
        fh1 = new FareHistory { FareHistoryId = fareHistoryId + 8, FareId = oldFareId,
     ObservationTS = depDate.AddDays(-16), StatusId = (int)DAL.Enum.Status.Active };
                    fareHistoriesSample.Add(fh1);

        fareHistoryResults.Enqueue(fareHistoriesSample); // fareHistoriesSample

        faresHistoryRepository.Setup(
                            fhr => fhr.Find(It.IsAny<ISpecification<FareHistory>>
    ())).Returns(()=>fareHistoryResults.Dequeue());
于 2013-01-24T10:44:19.483 に答える