2010-05-18 5 views
1

J'ai téléchargé Rhino Security aujourd'hui et j'ai commencé à passer quelques tests. Plusieurs qui s'exécutent parfaitement isolément commencent à recevoir des erreurs après que celui qui déclenche volontairement une exception fonctionne bien. Voici ce test:Récupération d'erreur nhibernate

[Test] 
    public void EntitiesGroup_IfDuplicateName_Error() { 
     _authorizationRepository.CreateEntitiesGroup("Admininstrators"); 

     _session.Flush(); 

     var ex = Assert.Throws<GenericADOException>(
      () => 
       { 
        _authorizationRepository.CreateEntitiesGroup("Admininstrators"); 
        _session.Flush(); 
       }).InnerException; 

     Assert.That(ex.Message, Is.StringContaining("unique")); 
    } 

Et voici les tests et les messages d'erreur qui ne:

[Test] 
    public void User_CanSave() { 
     var ayende = new User {Name = "ayende"}; 
     _session.Save(ayende); 
     _session.Flush(); 
     _session.Evict(ayende); 

     var fromDb = _session.Get<User>(ayende.Id); 
     Assert.That(fromDb, Is.Not.Null); 
     Assert.That(ayende.Name, Is.EqualTo(fromDb.Name)); 
    } 

    ----> System.Data.SQLite.SQLiteException : Abort due to constraint violation column Name is not unique 


    [Test] 
    public void UsersGroup_CanCreate() 
    { 
     var group = _authorizationRepository.CreateUsersGroup("Admininstrators"); 

     _session.Flush(); 
     _session.Evict(group); 

     var fromDb = _session.Get<UsersGroup>(group.Id); 
     Assert.NotNull(fromDb); 
     Assert.That(fromDb.Name, Is.EqualTo(group.Name)); 
    } 

failed: NHibernate.AssertionFailure : null id in Rhino.Security.Tests.User entry (don't flush the Session after an exception occurs) 

Does anyone see how I can reset the state of the in memory SQLite db after the first test? 

J'ai changé le code à utiliser nunit au lieu de xUnit alors peut-être que cela fait partie du problème ici bien.

Cheers,
Berryl

Ceci est la classe de base qui instancie la session

public abstract class DatabaseFixture : IDisposable 
{ 
    protected Account _account; 
    protected IAuthorizationRepository _authorizationRepository; 
    protected IAuthorizationService _authorizationService; 
    protected IPermissionsBuilderService _permissionsBuilderService; 
    protected IPermissionsService _permissionService; 
    protected User _user; 

    protected ISession _session; 
    protected readonly ISessionFactory _factory; 

    protected DatabaseFixture() 
    { 
     BeforeSetup(); 

     SillyContainer.SessionProvider = (() => _session); 
     var sillyContainer = new SillyContainer(); 
     ServiceLocator.SetLocatorProvider(() => sillyContainer); 

     Assert.NotNull(typeof(System.Data.SQLite.SQLiteConnection)); 

     var cfg = new Configuration() 
      .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName) 
      .SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName) 
      .SetProperty(Environment.ConnectionString, ConnectionString) 
      .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName) 
      .SetProperty(Environment.ReleaseConnections, "on_close") 
      .SetProperty(Environment.UseSecondLevelCache, "true") 
      .SetProperty(Environment.UseQueryCache, "true") 
      .SetProperty(Environment.CacheProvider,typeof(HashtableCacheProvider).AssemblyQualifiedName) 
      .AddAssembly(typeof (User).Assembly); 

     Security.Configure<User>(cfg, SecurityTableStructure.Prefix); 

     _factory = cfg.BuildSessionFactory(); 

     _session = _factory.OpenSession(); 

     new SchemaExport(cfg).Execute(false, true, false, _session.Connection, null); 

     _session.BeginTransaction(); 

     SetupEntities(); 

     _session.Flush(); 
    } 

    protected virtual void BeforeSetup() { } 

    public virtual string ConnectionString { get { return "Data Source=:memory:"; } } 

    public void Dispose() 
    { 
     if (_session.Transaction.IsActive) 
      _session.Transaction.Rollback(); 
     _session.Dispose(); 
    } 

    private void SetupEntities() 
    { 
     _user = new User {Name = "Ayende"}; 
     _account = new Account {Name = "south sand"}; 

     _session.Save(_user); 
     _session.Save(_account); 

     _authorizationService = ServiceLocator.Current.GetInstance<IAuthorizationService>(); 
     _permissionService = ServiceLocator.Current.GetInstance<IPermissionsService>(); 
     _permissionsBuilderService = ServiceLocator.Current.GetInstance<IPermissionsBuilderService>(); 
     _authorizationRepository = ServiceLocator.Current.GetInstance<IAuthorizationRepository>(); 

     _authorizationRepository.CreateUsersGroup("Administrators"); 
     _authorizationRepository.CreateEntitiesGroup("Important Accounts"); 
     _authorizationRepository.CreateOperation("/Account/Edit"); 


     _authorizationRepository.AssociateUserWith(_user, "Administrators"); 
     _authorizationRepository.AssociateEntityWith(_account, "Important Accounts"); 
    } 
} 
+0

J'ai extrait le début de la nouvelle session et la création de la base de données SQLite dans une méthode Setup et ai mis _session.Dispose dans une méthode Teardown afin que tous les tests soient exécutés. Je vais laisser cela ouvert un peu au cas où quelqu'un puisse voir comment Ayende et XUnit ont fait ce travail. Bravo – Berryl

Répondre

0

Comment allez-vous instancié la session?

Chaque fois qu'il y a une exception, la session doit être supprimée. Cela signifie également que vous ne devriez presque jamais partager la session entre les méthodes de test.

+0

Le code d'Ayende qui instancie la session dans le ctor d'une classe de base est à la fin de mon post original. Cheers – Berryl

+0

Ayende dispose de la session après chaque test, mais en utilisant XUnit et un appareil de base IDisposable pour le faire, contrairement à la méthode NUnit Teardown que je connais personnellement. Cela a du sens pour SQLite puisque la régénération de la base de données est aussi rapide. L'alternative que j'ai vu entre les tests lors de l'utilisation d'une base de données «réelle» est de commencer et annuler une transaction à chaque test. – Berryl

Questions connexes