1

这里的设置方法:

NHibernate 单元测试

使用 NHibernate.config:

[SetUp]
public virtual void SetUp()
{
    var mappingAssemblies = RepositoryTestsHelper.GetMappingAssemblies();
    this.configuration = NHibernateSession.Init(
    new SimpleSessionStorage(),
    mappingAssemblies,
    new AutoPersistenceModelGenerator().Generate(),
    "../../../Northwind.Web/NHibernate.config");
}

这不是有点狡猾,因为它引入了外部依赖吗?我想也可以通过编程方式创建 NHibernate.config 内容并将其传递给正确的 Init 方法签名。我是正确的吗?有人在安装过程中这样做了吗?谢谢。

4

2 回答 2

3

我已经成功地在我当前的项目中采用了类似的方法。首先它不是单元,而是映射集成测试,因为涉及外部资源即数据库,测试的执行时间和典型的技术问题:

  1. 最好不要使用现有的数据库模式,而是每次使用带有随机模式名称的配置从 nHibernate 创建和导出它。这将消除两个或多个开发人员在同一模式上同时运行集成测试的可能性:

    var export = new SchemaExport(configuration); export.Execute(脚本:false,export:true,justDrop:false,connection:databaseConnection,exportOutput:null);

  2. 请记住在使用后清理此架构。很容易在几天内耗尽磁盘空间等

  3. 考虑将此代码从 {[SetUp]} 移动到 {[FixtureSetUp]} 以节省测试夹具执行时间。与通常的内存单元测试执行时间相比,使用数据库需要大量时间

  4. 由于时间和资源消耗,与通常的单元测试相比,开发人员/CI 服务器可以不那么频繁地触发这种测试。在我的项目中,它们仅安排在夜间构建或手动触发构建期间。

  5. 您可以在运行时生成 nHibernate 配置,因此不需要“../../../Northwind.Web/NHibernate.config”

  6. 在许多情况下,您可以使用 SQLite,而不是使用 SQL Server,但映射通常针对每个 SQL 引擎

于 2012-12-17T13:36:20.750 回答
1

您可以按照您提到的那样以编程方式执行它,或者只是在您的测试项目中创建一个不同的 NHibernate.Config 或者只是在您的项目中添加一个指向实际 nhibernate.config 的链接(右键单击项目,添加现有项目,然后找到 NHibernate.Config 而不是单击添加请单击添加旁边的箭头并选择“添加为链接”)。

我想说真正狡猾的部分是使用生产中的 NHibernate.Config 进行测试。

在我过去做过这样的事情的地方,我们将创建一个专门用于测试的数据库(通过 db 迁移工具)并将其用于我们的测试。通过使用创建的数据库详细信息为测试生成配置文件,或者生成与测试项目中的配置匹配的数据库。

于 2012-12-17T13:32:26.123 回答