如何测试我的存储库实现?

时间:2011-02-18 15:55:47

标签: unit-testing nunit ddd-repositories

我正在使用NUnit作为测试单元。我在域上有我的接口,所以我准备在持久层中实现这些接口。我的问题是你如何实际进行单元测试以测试这些存储库?我相信这不是直接从数据库测试的好主意。我听说过使用SQLite的人,但是可以用mocks代替吗?当你可以使用实际实体提供模拟时,为什么人们会使用SQLite作为内存数据库?

任何一个例子也会受到欢迎。

注意:这是用C#编码的存储库,它们将使用NHibernate和Fluent NHibernate作为映射。

感谢。

2 个答案:

答案 0 :(得分:2)

它当然取决于,但在大多数情况下,我认为通常只需在测试中模拟存储库并仅使用内存中的SQLite数据库来测试映射(FluentNHibernate Persistence specification testing)。

对于使用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");
        ...
    }
}

答案 1 :(得分:0)

我个人会针对实际数据库(可能是SQL Express)对存储库进行功能测试。您每天只能在CI中运行一次这些测试。

其他类的所有单元测试都可以安全地假设存储库工作并使用模拟存储库。

编辑:以上假设您的存储库仅用于数据访问;他们基本上只使用LINQ或HQL。保持业务逻辑不受限制!