3

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

任何例子也将受到欢迎。

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

谢谢。

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 中运行一次这些测试。

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

编辑:以上假设您的存储库仅用于数据访问;他们基本上只使用 LINQ 或 HQL。将业务逻辑排除在外!

于 2011-02-18T16:19:23.657 回答