2010-01-09 6 views
0

J'ai récemment commencé à apprendre NH Fluent, et j'ai quelques problèmes avec cette méthode de test. Cela prend une éternité à courir (cela fait maintenant plus de dix minutes qu'il fonctionne et aucun signe de progrès ...).Test de cartographie NHibernate Fluent prend une éternité

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

    TestMapping<Entry>(testAction); 
} 

avec cette méthode d'aide (un peu simplifié - j'ai deux ou trois blocs try/catch aussi, pour fournir plus agréables messages d'erreur):

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

La méthode DependencyFactory.CreateSessionFactory() ressemble à ceci:

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

J'ai essayé le débogage, mais je ne peux pas savoir où est le goulot d'étranglement. Pourquoi cela prend-il si longtemps?

+0

Depuis combien de temps est 'long'? Et combien de mappages dans le périmètre? –

+0

J'ai dit dix minutes, mais maintenant ça fait plus d'une demi-heure - et le testeur dit encore "En cours ...". Jusqu'à présent, seulement deux cartographies - et les deux sont très simples. –

Répondre

1

Je pense que cela a à voir avec la façon dont vous essayez d'utiliser la session avec la spécification de persistance. Faire une classe de test de base comme celle ci-dessous qui vous fournit une session; Si le test complet dure plus de 3 à 4 secondes, quelque chose ne va pas.

Cheers,
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

Merci pour la réponse! J'ai pris la liberté d'éditer votre réponse pour que le code soit joli tout le long. Je suis incapable de comprendre d'où vient la classe NHibernateInMemboryDbSession. Fait-il partie d'une assemblée, ou dois-je le définir moi-même? –

+0

J'avais supposé que vous le créeriez, mais je l'ai ajouté ci-dessus pour vous montrer à quoi cela ressemblerait. À votre santé – Berryl

+0

Ho Tomas. Comment cela s'est-il passé? – Berryl

Questions connexes