0

Я использую код Ayende из его блог на модульном тестировании с NHibernate и он требует тестирования с SQLite, код следующим образом:NUnit NHibernate и модульное тестирование Moq метания NHibernate.MappingException

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(); 
     } 
    } 

И Model:

public abstract class Film : Entity<Film> 

Который имеет вложенный класс:

public class PdfFilm: Film 

И начинается это отображение конфигурации в том же файле, что и родитель, как:

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

The 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) 
+0

Вы используете XML-сопоставления? Если да, то каковы имена файлов xml и установлены ли они как внедренные ресурсы? – Suhas

ответ

0

Эта ошибка всегда отчетности о один вопрос: конфигурация NHibernate, используется для построения ISessionFactory - не получил ожидаемого отображение. Ниже приведено подробное описание того, что все мы должны проверить, чтобы убедиться, что отображение XML-файл будет использоваться:

Наиболее важные три вещи, чтобы проверить (и почти всегда раствор): файл отображения

  • XML НЕ makred, как Внедренный ресурс
  • XML-файл не является частью .dll, который сконфигурирован в качестве источника отображения <mapping assembly="MyProject.Data" /> (см <session-factory> конфигурацию) (в случае, описанном выше, быть уверенным, что отображение является частью сборки перешла в: AddAssembly(assemblyContainingMapping))
  • XML файл не имеет суффикса по умолчанию .hbm.xml
+0

Я добавил файлы hbm в соответствующую сборку, но теперь получаю следующую ошибку: WebAPI.Tests.WebApi.Controllers.FilmsControllerTests.CanSaveAndLoadBook: System.MissingFieldException: Поле не найдено: «NHibernate.NHibernateUtil.Binary». – JensenB

Смежные вопросы