0

J'ai deux problèmes.Tests de référence et de référence de persistance NHibernate Fluent

1. FNH ne teste pas correctement mes composants et je ne sais pas pourquoi.

System.ApplicationException: attendu 'DomainModel.Model.Publisher' mais a 'DomainModel.Model.Publisher' pour Propriété 'Editeur'.

[TestMethod] 
public void CanCorrectlyMapBook() 
{ 
    new PersistenceSpecification<Book>(_session) 
     .CheckProperty(p => p.Name, "My Book") 
     .CheckProperty(p=> p.Id, 1) 
     .CheckProperty(p=>p.IncludesCDDVD, true) 
     .CheckProperty(p=>p.Isbn, "rder93q43949éwr") 
     .CheckProperty(p=>p.IsLoaned, false) 
     .CheckProperty(p=>p.Publisher, new Publisher(){PublisherHomepage = "www.google.de", PublisherName = "google"}) 
     .VerifyTheMappings(); 
} 

}

2. FNH ne teste pas ma référence correctement.

System.ApplicationException: attendu 'DomainModel.Model.Employee' mais a 'EmployeeProxyd6f94daa37c74be8b5ccccf40c5c23fa' pour 'LoanedBy' la propriété.

[TestMethod] 
public void CanCorrectlyMapBook() 
{ 
    new PersistenceSpecification<Book>(_session) 
     .CheckProperty(p => p.Name, "My Book") 
     .CheckProperty(p=> p.Id, 1) 
     .CheckProperty(p=>p.IncludesCDDVD, true) 
     .CheckProperty(p=>p.Isbn, "rder93q43949éwr") 
     .CheckProperty(p=>p.IsLoaned, false) 
     .CheckReference(p=>p.LoanedBy, new Employee(){EMail = "",FirstName = "Alex", LastName = "Mueller"}) 
     .VerifyTheMappings(); 
} 

Mais quand je teste ce tout fonctionne "manuellement" bien.

ISession mysession = Helper.CreateSessionFactory(false, false).OpenSession(); 
      Book myBook = new Book() 
           { 
            Author = "Hesse", 
            IncludesCDDVD = true, 
            DateOfIssue = DateTime.Now, 
            Isbn = "erwe0ri", 
            IsLoaned = true, 
            Name = "My Book new", 
            Publisher = new Publisher() { PublisherHomepage = "www.google.de", PublisherName = "google" }, 
            Release = new Release() { ReleaseDate = DateTime.Now, ReleaseNumber = 1 }, 
            LoanedBy = new Employee() { EMail = "", FirstName = "Alex", LastName = "Mueller" } 
           }; 

      mysession.Save(myBook); 
      mysession.Close(); 
      mysession.Dispose(); 

Je le vérifier en regardant dans le datbase ...

Les tests de PersistenceSpecification exécuté sur une base de données en mémoire SqlLite et mon manuel « test » va à l'encontre d'un Sql Server 2008.

Est-ce que quelqu'un d'entre vous a utilisé FNH et testé correctement une référence et un composant?

Répondre

3

Je pense que vous devez implémenter la méthode object.Equals() sur les entités concernées, ou implémenter un IEqualityComparer et l'injecter lors de la construction de PersistenceSpecification.

Par exemple:

public class A 
{ 
    private int Id { get; set; } 
    public virtual B B_Member { get; set; } 

    public class Map : ClassMap<A> 
    { 
     public Map() 
     { 
      Id(x => x.Id); 
      References(x => x.B_Member); 
     } 
    } 
} 

public class B 
{ 
    private int Id { get; set; } 
    public virtual string BString { get; set; } 

    public class Map : ClassMap<B> 
    { 
     public Map() 
     { 
      Id(x => x.Id); 
      Map(x => x.BString); 
     } 
    } 

    /// remove this method to have the verification fail 
    public override bool Equals(object obj) 
    { 
     var lhs = obj as B; 
     if (lhs == null) return false; 
     return BString == lhs.BString; 
    } 
} 

    [Test] 
    public void Verify() 
    { 
     var fcfg = Fluently.Configure() 
      .Database(SQLiteConfiguration.Standard.UsingFile("testdb.sqldb")) 
      .Mappings(mc => 
      { 
       mc.FluentMappings.Add(typeof (A.Map)); 
       mc.FluentMappings.Add(typeof (B.Map)); 
      }) 
      .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false)); 

     var sess = fcfg.BuildSessionFactory().OpenSession(); 

     new PersistenceSpecification<A>(sess) 
      .CheckReference(x => x.B_Member, new B() {BString = "hi"}) 
      .VerifyTheMappings(); 

     Assert.Throws<ApplicationException>(
      () => new PersistenceSpecification<A>(sess, new AlwaysFalseEqualityComparer()) 
        .CheckReference(x => x.B_Member, new B() {BString = "az"}) 
        .VerifyTheMappings()); 
    } 

Notez également que le code FNH pertinent pour chaque comparaison de propriété est (compliments de réflecteur):

internal virtual void CheckValue(object target) 
{ 
    bool areEqual; 
    object actual = this.property.GetValue(target, null); 
    if (this.entityEqualityComparer != null) 
    { 
     areEqual = this.entityEqualityComparer.Equals(this.propertyValue, actual); 
    } 
    else 
    { 
     areEqual = this.propertyValue.Equals(actual); 
    } 
    if (!areEqual) 
    { 
     throw new ApplicationException(string.Format("Expected '{0}' but got '{1}' for Property '{2}'", this.propertyValue, actual, this.property.Name)); 
    } 
} 

Certainement que cette exception semble correspondre à ceux que vous êtes expérimenter.

+0

Je pense que cela n'aide pas, car les composants ne sont pas des entités, donc ils n'ont pas d'ID. J'ai implémenté la méthode object.Equals, mais il y a toujours le même message d'erreur pour mes composants et références. Mais ce serait bien si quelqu'un peut me montrer un exemple simple où l'on peut voir que l'API FNH fonctionne correctement. Pour moi, il semble que non. – Rookian

+0

Je ne suis pas sûr pourquoi les composants n'étant pas des entités signifieraient que l'implémentation d'égales ou un equalcomparer n'aiderait pas. J'ai fourni un exemple simple pour une référence. – fostandy

Questions connexes