views:

412

answers:

1

Hi!

I have two problems.

1 . FNH does not test my component correcty and I dont know why.

System.ApplicationException: Expected 'DomainModel.Model.Publisher' but got 'DomainModel.Model.Publisher' for Property 'Publisher'.

[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 does not test my reference correctly.

System.ApplicationException: Expected 'DomainModel.Model.Employee' but got 'EmployeeProxyd6f94daa37c74be8b5ccccf40c5c23fa' for Property 'LoanedBy'.

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

But when I test this "manually" everything works fine.

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

I have verify this by looking up in the datbase ...

The PersistenceSpecification Tests run against an in-memory database sqllite and my manual "test" runs against a Sql Server 2008.

Does anybody of you have used FNH and tested a reference and a component correctly?

+1  A: 

I think you either need to implement the object.Equals() method on the relevant entities, or implement an IEqualityComparer and inject it when you construct the PersistenceSpecification.

For example:

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

Note also that the relevant FNH code for each property comparison is (compliments of reflector):

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

Certainly that that exception seems to match the ones you are experiencing.

fostandy
I think this does not help, because components are no entities so they have no Ids. I have implemented the object.Equals method, but there is still the same error message for my components and reference. But it would be nice if someone can show me a simple example where one can see that the FNH API works correctly. For me it seems it does not.
Rookian
I'm not sure why components not being entities would mean that implementing equals or an equalitycomparer would not help. I have provided a simple example for a reference.
fostandy
ok for the component it seems to be working! But Visual Studio and Resharper are calling a warning... Warning 1 'DomainModel.Model.Publisher' overrides Object.Equals(object o) but does not override Object.GetHashCode()... how can I override the GetHasCode() method correctly?
Rookian