2010-11-17 23 views
2

Eh bien, c'est mon tout premier projet avec hibernate. J'ai eu une petite expérience en hibernation et nhibernate.Comment tester générer des tables avec nhibernate fluide (schemaexport)? dans le contexte d'asp.net

Ce contexte est complètement nouveau pour moi puisqu'il s'agit d'un projet d'application web. J'ai donc mon projet webapp avec la plupart des nhibernate couramment trouvés sur le net. donc j'avoir cette entités:

namespace myproject.model 
{ 
    public class Request 
    { 
    public virtual string Id { get; private set; } 
    public virtual Route route { get; set; } 
    public virtual int code { get; set; } 

    } 
} 

namespace myproject.model 
{ 
    public class Route 
    { 
    public virtual string Id { get; private set; } 
    public virtual string client_id { get; set; } 
    public virtual IList<Request> requests { get; set; } 

    public Route() 
    { 
     requests = new List<Request>(); 
    } 

    } 

} 

//Mapping are like this.will only post one 
namespace myproject.mappings 
{ 
public class RequestMap : ClassMap<Request> 
{ 
    public RequestMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.short_code); 
     References(x => x.route); 
    } 
    } 
} 

//NhibernateSessionPerRequest 
namespace myproject.Boostrap 
{ 
    public class NhibernateSessionPerRequest : IHttpModule 
    { 
    private static readonly ISessionFactory _sessionFactory; 

    static NhibernateSessionPerRequest() 
    { 
     _sessionFactory = CreateSessionFactory(); 
    } 

    //all others IHttpModule event and methods are here 
    private static ISessionFactory CreateSessionFactory() 
    { 

     FluentConfiguration configuration = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005. 
                       ConnectionString(x => x.FromConnectionStringWithKey("localdb"))) 
      .Mappings(m => { 
          m.FluentMappings.AddFromAssemblyOf<myproject.model.Request>(); 
          m.FluentMappings.AddFromAssemblyOf<myproject.model.Route>(); 
          } 
        ).ExposeConfiguration((c)=> savedConfig = c);; 

     return configuration.BuildSessionFactory(); 
    } 

    } 

    private static Configuration savedConfig; 

    public static void BuildSchema(NHibernate.Cfg.Configuration config) 
    { 
     new SchemaExport(config).Create(false, true); 
    } 

    public static void BuildSchema(ISession session) 
    { 
     var export = new SchemaExport(savedConfig); 
     export.Execute(false,true,false,session.Connection,null); 
    } 


} 

J'ai ajouté le module dans webconfig

<add name="NhibernateSessionPerRequest" type="myproject.Boostrap.NhibernateSessionPerRequest"/> 

afin de tester la génération des tableaux que j'ai ajouté un projet de test (bibliothèque de classes) ajoutée réf à nunit.framework 2.8.5 et myproject.

namespace myproject.Tests 
{ 
    [TestFixture] 
    public class CanGenerateSchemaTestSuite 
    { 
    [Test] 
    public void CanGenarateSchema() 
    { 
     NhibernateSessionPerRequest.BuildSchema(NhibernateSessionPerRequest.GetCurrentSession()); 

    } 
    } 
} 

la méthode de test échoue toujours, et je vais avoir cette exception:

CanGenerateSchemaTestSuite (1 essai), 1 test a échoué: test de l'enfant n'a pas CanGenarateSchema, Échec: System.TypeInitializationException

alors comment tester est fait dans un contexte asp.net ?? merci de lire ceci.thanks

Répondre

5

Voici un exemple de la mienne. Vous devez utiliser ExposeConfiguration et passer une méthode qui accepte une configuration et que vous venez d'y construire la base de données, puis en utilisant SchemaExport:

class SqliteRefSessionFactoryProvider : ISessionFactoryProvider 
{ 

    public const string SqliteRefFileName = "ref.db"; 

    public ISessionFactory GetSessionFactory() 
    { 
     return Fluently.Configure().Database(
      SQLiteConfiguration.Standard.UsingFile(SqliteRefFileName).ShowSql()) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SsoToken>()) 
      .ExposeConfiguration(BuildSchema) 
      .BuildSessionFactory(); 
    } 

    private static void BuildSchema(NHibernate.Cfg.Configuration configuration) 
    { 
     if (File.Exists(SqliteRefFileName)) 
      File.Delete(SqliteRefFileName); 

     new SchemaExport(configuration) 
      .Create(false, true); 
    } 
} 
+0

oh c'était vraiment gentil de vous.J'ai vu l'astuce. Mais une autre préoccupation reste.Pour le look de if.I J'aurai à le faire dans ma classe 'NhibernateSessionPerRequest' et' BuildSchem'a serait rendu privé. Alors comment est-ce que je lance la méthode 'BuildSchema', encore plus loin comment l'exécuter dans mon' projet de test'? merci –

+0

Comme vous pouvez le voir, j'ai mon propre ISessionFactoryProvider qui est DI-ed dans le singleton de la fabrique de sessions. Pour le test unitaire, j'utilise un test qui fait aussi la construction. Est-ce que c'est ce que vous vouliez dire par la question? – Aliostad

+0

Bonjour je n'utilise aucune sorte de librairie Dependency Injection, mon problème ici est de ne pas être capable de comprendre comment tester ceci dans un projet séparé (signifiant mon testproject), j'ai mis à jour le titre de ce post et ajouté nouvelles approches que j'ai obtenu de votre réponse. S'il vous plaît laissez-moi savoir si je me trompe.Merci pour votre temps –

7

Juste un commentaire vague sur l'autre solution; vous n'avez pas besoin de supprimer complètement les fichiers de base de données pour cela; il suffit de déposer les tables:

.ExposeConfiguration(SetupTestDatabase) 

... 

private static void SetupTestDatabase(NHibernate.Cfg.Configuration config) 
{ 
    var schema = new SchemaExport(config); 
    schema.Drop(true, true); 
    schema.Create(true, true); 
} 

Cela signifie simplement que vous pouvez exécuter vos tests sur une base de données différente sans rien changer d'autre.

Modifier; woops; pensé que c'était une solution acceptée. Si vous le faites dans un test, il suffit de le faire comme ceci:

[Test] 
    public void Test_can_store_and_get_objects() 
    { 
     var factory = CreateSessionFactory(); 
     using (var s = factory.OpenSession()) 
     { 
      ... 
     } 
    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("firstProject.db")) 
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Address>()) // <-- Refer to parent project 
     .ExposeConfiguration(SetupTestDatabase) 
     .BuildSessionFactory(); 
    }