【问题标题】:NUnit NHibernate and Moq unit test throwing NHibernate.MappingExceptionNUnit NHibernate 和 Moq 单元测试抛出 NHibernate.MappingException
【发布时间】:2015-08-13 14:30:28
【问题描述】:

我正在使用 Ayende 博客中关于 NHibernate 单元测试的代码,它要求使用 SQLite 进行测试,代码如下:

using System;
using System.Reflection;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Tool.hbm2ddl;
using Environment = NHibernate.Cfg.Environment;

namespace WebAPI.Tests
{
    /// <summary>
    /// http://ayende.com/blog/3983/nhibernate-unit-testing
    /// </summary>
    public class InMemoryDatabaseTest : IDisposable
    {
        private static Configuration _configuration;
        private static ISessionFactory _sessionFactory;
        protected ISession Session;

        public InMemoryDatabaseTest(Assembly assemblyContainingMapping)
        {
            if (_configuration == null)
            {
                _configuration = new Configuration()
                    .SetProperty(Environment.ReleaseConnections, "on_close")
                    .SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName)
                    .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName)
                    .SetProperty(Environment.ConnectionString, "data source=:memory:")
                    .AddAssembly(assemblyContainingMapping);

                _sessionFactory = _configuration.BuildSessionFactory();
            }

            Session = _sessionFactory.OpenSession();

            new SchemaExport(_configuration).Execute(false, true, false);
        }

        public void Dispose()
        {
            Session.Dispose();
        }
    }
}

我的测试课是:

[TestFixture]
public class FilmsControllerTests : InMemoryDatabaseTest
{
    public FilmsControllerTests() : base(typeof(Film).Assembly)
    {
    }

    static readonly Guid ValidFilmId = new Guid("35d3ee0f5ee011bd8822ed629e5");

    [Test]
    public void CanSaveAndLoadFilm()
    {
        object id;

        using (var tx = Session.BeginTransaction())
        {
            id = Session.Save(new PdfFilm
            {
                IsEnabled = true,
                Id = ValidFilmId,
                PremiumLevel = 1,
                PublishDate = new DateTime(20121010),
                Pdf = new Document(new byte[byte.Parse(" 162")], new DateTime(20121010)),
                Title = "jel",
                Authors = "smel",

            });

            tx.Commit();
        }

        Session.Clear();


        using (var tx = Session.BeginTransaction())
        {
            var Film = Session.Get<PdfFilm>(id);

            Assert.AreEqual(new DateTime(2012, 10, 10), Film.PublishDate);

            tx.Commit();
        }
    }

和型号:

public abstract class Film : Entity<Film>

其中有一个嵌套类:

public class PdfFilm: Film

并在与父级相同的文件中启动它的映射配置:

<subclass name="PdfFilm" discriminator-value="Pdf">

NUnit 单元测试返回:

NHibernate.MappingException : No persister for: Core.PdfFilm

我检查了电影映射文件的属性并将其设置为嵌入式资源 - 任何人都可以确认这是否是最简单的测试方法以及错误消息的含义吗?

堆栈跟踪:

at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)

【问题讨论】:

  • 您在使用 XML 映射吗?如果是,xml 文件的名称是什么?它们是否设置为嵌入资源?

标签: asp.net unit-testing nhibernate nunit nhibernate-configuration


【解决方案1】:

这个错误总是报告一个问题:NHibernate 配置,用于构建 ISessionFactory - 没有收到预期的映射。这是一个详细的概述,我们必须检查以确保使用 xml 映射文件:

要检查的最重要的三件事(几乎总是解决方案):

  • xml 映射文件未被标记为嵌入式资源
  • xml 文件不是配置为映射源&lt;mapping assembly="MyProject.Data" /&gt; 的 .dll 的一部分(请参阅&lt;session-factory&gt; 配置)(在上述情况下,请确保映射是传递到的程序集的一部分:AddAssembly(assemblyContainingMapping))
  • xml文件没有默认后缀.hbm.xml

【讨论】:

  • 我已将 hbm 文件添加到相关程序集,但现在出现以下错误: WebAPI.Tests.WebApi.Controllers.FilmsControllerTests.CanSaveAndLoadBook: System.MissingFieldException : Field not found: 'NHibernate.NHibernateUtil .二进制'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
相关资源
最近更新 更多