2010-01-09 4 views
0

Я недавно начал изучать Fluent NH, и у меня возникают некоторые проблемы с этим методом тестирования. Требуется навсегда запустить (он работает уже более десяти минут, и никаких признаков прогресса нет).Fluent NHibernate Картографический тест берет навсегда

[TestMethod] 
public void Entry_IsCorrectlyMapped() 
{ 
    Action<PersistenceSpecification<Entry>> testAction = pspec => pspec 
               .CheckProperty(e => e.Id, "1") 
               .VerifyTheMappings(); 

    TestMapping<Entry>(testAction); 
} 

с этим вспомогательным методом (немного упростили - у меня есть несколько Try/улов блоков тоже, чтобы обеспечить более хорошие сообщения об ошибках):

public void TestMapping<T>(Action<PersistenceSpecification<T>> testAction) where T : IEntity 
{ 
    using (var session = DependencyFactory.CreateSessionFactory(true).OpenSession()) 
    { 
     testAction(new PersistenceSpecification<T>(session)); 
    } 
} 

Метод DependencyFactory.CreateSessionFactory() выглядит следующим образом:

public static ISessionFactory CreateSessionFactory(bool buildSchema) 
{ 
    var cfg = Fluently.Configure() 
     .Database(SQLiteConfiguration.Standard.InMemory()) 
     .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Entry).Assembly)); 

    if (buildSchema) 
    { 
     cfg = cfg.ExposeConfiguration(config => new SchemaExport(config).Create(false, true)); 
    } 
    return cfg.BuildSessionFactory(); 
} 

Я пробовал отлаживать, но я не могу понять, где узкое место. Почему это так долго?

+0

Как долго 'долго'? И сколько отображений в пределах области? –

+0

Я сказал десять минут, но теперь прошло уже полчаса - и тест-бегун все еще говорит «В процессе ...». Пока что только два сопоставления - и оба очень простые. –

ответ

1

Я бы подумал, что это связано с тем, как вы пытаетесь использовать сеанс вместе с спецификацией persistence. Создайте базовый тестовый класс, подобный приведенному ниже, который предоставит вам сеанс; если весь тест длится дольше 3-4 секунд, что-то не так.

Приветствия,
Berryl

[TestFixture] 
public class UserAutoMappingTests : InMemoryDbTestFixture 
{ 
    private const string _nickName = "berryl"; 
    private readonly Name _name = new Name("Berryl", "Hesh"); 
    private const string _email = "[email protected]"; 

    protected override PersistenceModel _GetPersistenceModel() { return new UserDomainAutoMapModel().Generate(); } 

    [Test] 
    public void Persistence_CanSaveAndLoad_User() 
    { 
     new PersistenceSpecification<User>(_Session) 
      .CheckProperty(x => x.NickName, _nickName) 
      .CheckProperty(x => x.Email, _email) 
      .CheckProperty(x => x.Name, _name) 
      .VerifyTheMappings(); 
    } 

} 

public abstract class InMemoryDbTestFixture 
{ 
    protected ISession _Session { get; set; } 
    protected SessionSource _SessionSource { get; set; } 
    protected Configuration _Cfg { get; set; } 

    protected abstract PersistenceModel _GetPersistenceModel(); 
    protected PersistenceModel _persistenceModel; 

    [TestFixtureSetUp] 
    public void SetUpPersistenceModel() 
    { 
     _persistenceModel = _GetPersistenceModel(); 
    } 

    [SetUp] 
    public void SetUpSession() 
    { 
     NHibInMemoryDbSession.Init(_persistenceModel); // your own session factory 
     _Session = NHibInMemoryDbSession.Session; 
     _SessionSource = NHibInMemoryDbSession.SessionSource; 
     _Cfg = NHibInMemoryDbSession.Cfg; 
    } 

    [TearDown] 
    public void TearDownSession() 
    { 
     NHibInMemoryDbSession.TerminateInMemoryDbSession(); 
     _Session = null; 
     _SessionSource = null; 
     _Cfg = null; 
    } 
} 

public static class NHibInMemoryDbSession 
{ 
    public static ISession Session { get; private set; } 
    public static Configuration Cfg { get; private set; } 
    public static SessionSource SessionSource { get; set; } 

    public static void Init(PersistenceModel persistenceModel) 
    { 
     Check.RequireNotNull<PersistenceModel>(persistenceModel); 

     var SQLiteCfg = SQLiteConfiguration.Standard.InMemory().ShowSql(); 
     SQLiteCfg.ProxyFactoryFactory(typeof(ProxyFactoryFactory).AssemblyQualifiedName); 

     var fluentCfg = Fluently.Configure().Database(SQLiteCfg).ExposeConfiguration(cfg => { Cfg = cfg; }); 
     SessionSource = new SessionSource(fluentCfg.BuildConfiguration().Properties, persistenceModel); 
     Session = SessionSource.CreateSession(); 
     SessionSource.BuildSchema(Session, true); 
    } 

    public static void TerminateInMemoryDbSession() 
    { 
     Session.Close(); 
     Session.Dispose(); 
     Session = null; 
     SessionSource = null; 
     Cfg = null; 
     Check.Ensure(Session == null); 
     Check.Ensure(SessionSource == null); 
     Check.Ensure(Cfg == null); 
    } 
} 
+0

Спасибо за ответ! Я позволил вам отредактировать ваш ответ, чтобы код выглядел хорошо. Я не могу понять, откуда взялся класс NHibernateInMemboryDbSession. Является ли это частью какой-либо сборки, или я должен сам ее определить? –

+0

Я предполагал, что вы его создадите, но я добавил его выше, чтобы показать вам, как он будет выглядеть. Cheers – Berryl

+0

Ho Tomas. Как это сработало для вас? – Berryl

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