3

テストユニットにNUnitを使用しています。ドメインにインターフェースがあるので、永続層にこれらのインターフェースを実装する準備ができています。私の質問は、これらのリポジトリをテストするための単体テストを実際にどのように行うのかということです。これは、データベースから直接テストするのは良い考えではないと思います。SQLiteを使用している人を聞いたことがありますが、代わりにモックを使用しても大丈夫ですか?実際のエンティティでモックを提供できるのに、なぜ人々はインメモリデータベースにSQLiteを使用しているのですか?

どんな例でも歓迎されます。

注:これは、マッピングとしてNHibernateとFluent NHibernateを使用するC#でコーディングされたリポジトリーを対象としています。

ありがとう。

4

2 に答える 2

2

もちろん状況によって異なりますが、ほとんどの場合、テストでリポジトリをモックし、マッピングをテストするためだけにインメモリSQLiteデータベースを使用するだけで十分だと思います(FluentNHibernate Persistence仕様テスト)。

SQLiteを使用したNUnitマッピングテストでは、次の基本クラスを使用しています。

public abstract class MappingsTestBase
{
    [SetUp]
    public void Setup()
    {
        _session = SessionFactory.OpenSession();
        BuildSchema(_session);
    }

    [TestFixtureTearDown]
    public void Terminate()
    {
        _session.Close();
        _session.Dispose();

        _session = null;
        _sessionFactory = null;
        _configuration = null;
    }

    #region NHibernate InMemory SQLite Session

    internal static ISession _session;

    private static ISessionFactory _sessionFactory;
    private static Configuration _configuration;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                FluentConfiguration configuration = Fluently.Configure()
                    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql)
                    .Mappings(m => m.FluentMappings
                        .AddFromAssemblyOf<NHibernateSession>())
                    .ExposeConfiguration(c => _configuration = c);

                _sessionFactory = configuration.BuildSessionFactory();
            }

            return _sessionFactory;
        }
    }

    private static void BuildSchema(ISession session)
    {
        SchemaExport export = new SchemaExport(_configuration);
        export.Execute(true, true, false, session.Connection, null);
    }

    #endregion
}

上記の基本クラスから派生したマッピングテストクラスの例は、次のようになります。

[TestFixture]
public class MappingsTest : MappingsTestBase
{
    [Test]
    public void Persistence_Employee_ShouldMapCorrectly()
    {
        Category employee = new PersistenceSpecification<Employee>(_session)
            .CheckProperty(e => e.Id, 1)
            .CheckProperty(e => e.FirstName, "John")
            .CheckProperty(e => e.LastName, "Doe")
            .VerifyTheMappings();
        ...
        Assert.Equals(employee.FirstName, "John");
        ...
    }
}
于 2011-02-18T20:21:00.003 に答える
0

個人的には、実際のデータベース(SQL Expressの可能性があります)に対してリポジトリの機能テストを行います。CIでこれらのテストを実行できるのは1日1回だけです。

他のクラスのすべての単体テストは、リポジトリが機能し、モックリポジトリを使用していることを安全に想定できます。

編集:上記は、リポジトリがデータアクセスのみに使用されていることを前提としています。基本的にはLINQまたはHQLを使用します。それらからビジネスロジックを遠ざけてください!

于 2011-02-18T16:19:23.657 に答える