如何为Fluent nHibernate约定创建一个测试?

4
我正在创建一个Fluent nHibernate约定集。我创建了一些约定,比如主键、外键和多对多表。
我希望能够使用内存数据库测试这些约定,以确定我是否正确编码了这些约定。
目前,我正在使用SQlite内存数据库来设置nHibernate,如下所示:
Configuration configuration = null;

var factory = Fluently.Configure()
    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
    .Mappings(m => 
        {
            m.FluentMappings.AddFromAssemblyOf<DataLayer>();
            m.FluentMappings.Conventions.AddFromAssemblyOf<DataLayer>();
        })
    .ExposeConfiguration((c) => configuration = c)
    .BuildSessionFactory();

var session = factory.OpenSession();

var export = new SchemaExport(configuration);
export.Execute(true, true, false, session.Connection, null);

我创建了一个测试用例,但我不知道如何测试命名约定。如何在使用Visual Studio测试项目时对约定进行单元测试?


正是我正在寻找的。但我想测试将列配置为DataAnnotation中的属性“StringLength”和“Required”。你找到任何解决方案了吗? - ridermansb
我没有找到任何解决方案。我不再在同一个地方工作,这个项目也没有起飞。 - Pierre-Alain Vigeant
1个回答

0
我所做的不是针对数据库进行测试,而只是测试生成的映射。例如,我有一个约定,规定所有外键都写成ID的形式,并且我进行类似于以下方式的测试(我使用的是xunit而非mstest,但希望您可以理解这个概念...):
    [Fact]
    public void AddDefaultConventions_ShouldNameMappingToForeinKeyCorrectly()
    {
        var configuration = Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008)
        .Mappings(m =>
        {
            m.FluentMappings.Conventions.Add(new CustomForeignKeyConvention());
            m.FluentMappings.Add<TestClassMap>();
            m.FluentMappings.Add<TestClass2Map>();
        })
        .BuildConfiguration();
        var typeMapping = configuration.GetClassMapping(typeof(TestClass2));
        var property = typeMapping.GetProperty("Parent");
        Assert.Equal("ParentID", property.ColumnIterator.First().Text);
    }

    private class TestClass
    {
        public virtual int ID { get; set; }
    }

    private class TestClass2
    {
        public virtual int ID { get; set; }
        public virtual TestClass Parent { get; set; }
    }

    private class TestClassMap : ClassMap<TestClass>
    {
        public TestClassMap()
        {
            Id(x => x.ID);
        }
    }

    private class TestClass2Map : ClassMap<TestClass2>
    {
        public TestClass2Map()
        {
            Id(x => x.ID);
            References(x => x.Parent);
        }
    }

顺便说一下,针对数据库进行测试不会太困难,只需要尝试从TestClass2中选择一些内容,并确保不会抛出异常... 但我认为我展示的方法更简单,我相信当FluentNhibernate能够生成正确的NHibernate映射时,NHibernate能为我生成正确的查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接