2

FakeItEasy を使用してリポジトリに偽の nHibernate セッションを挿入し、テスト内で定義済みのオブジェクトのリストを返したいと考えています。誰もこれを行った経験がありますか?

テストの例を次に示します。

[TestFixture]
public class ProductionRepositoryTester
{
 private ProductionRepository _productionRepository;

[SetUp]
public void SetupFixture()
{
    const string propertyNumber = "123";
    Tank tank = new Tank { PropertyNumber = propertyNumber };

    var session = A.Fake<ISession>();
    var sessionFactory = A.Fake<ISessionFactory>();

    A.CallTo(session).WithReturnType<IList<Tank>>().Returns(new List<Tank> { tank });

    _productionRepository = new ProductionRepository(session, sessionFactory);
}

[Test]
public void ProductionRepositoryCanGetTanks()
{
    var tanks = _productionRepository.GetTanks();

    Assert.AreNotEqual(0, tanks.Count(), "Tanks should have been returned.");

}
}

実際の ProductionRepository クラス内の呼び出しは次のとおりです。

public IEnumerable<Tank> GetTanks()
{
    var tanks = Session.CreateCriteria(typeof(Tank)).List<Tank>();
    return tanks;
}

アドバイスをよろしくお願いします!

4

1 に答える 1

7

まず第一に、NHibernate インターフェースをまったく偽造しないことをお勧めします。これは (私の意見では) 単体テストするにはレベルが低すぎます。これらのシナリオでは、いくつかの統合テストを行った方がよいでしょう。つまり、ProductionRepository (IProductionRepository) の抽象化を使用してすべての相互作用を単体テストしますが、そこで停止します。ただし、これは私の意見にすぎません。本当にこれを行いたい場合は、偽のセットアップを変更する必要があると思います。

セッションは、IList を直接返すのではなく、条件を返します。したがって、偽の基準も必要です。

var fakeCriteria = A.Fake<ICriteria>();

A.CallTo(fakeCriteria).WithReturnType<IList<Tank>>().Returns(new List<Tank> { tank });

A.CallTo(session).WithReturnType<ICriteria>().Returns(fakeCriteria);

(条件の種類を正しく覚えていることを願っています。ICriteria だと思いますが、100% 確実ではありません。)

于 2011-06-21T20:34:26.537 に答える