Является ли этот тест картирования Fluent NHibernate ложноположительным? - PullRequest
3 голосов
/ 29 июня 2011

Я изменил свой тест отображения для использования перегрузки .VerifyTheMappings(TEntity first), и вдруг мой тест просто проходит. Я не использовал эту перегрузку раньше, и, поскольку я не совсем уверен, как она работает, я беспокоюсь, что получаю ложное срабатывание.

Я удивлен главным образом потому, что я не думал, что использую автоматическое сопоставление, и я даже еще не сопоставил всю сущность. Так что теперь мне интересно:

Пройдет ли этот тест, потому что должен, или потому, что он на самом деле ничего не тестирует?

Обновление: После дальнейших исследований я обнаружил, что, пока я сопоставляю идентификатор, все работает. Это так и должно быть? Что действительно проверяет .VerifyTheMappings(TEntity first) ?

Мой код:

Конфигурация

 Fluently.Configure()
     .Database(MsSqlConfiguration.MsSql2008.DefaultSchema("dbo")
     .ConnectionString(ConfigurationManager.ConnectionStrings["Nitro_Empty"].ConnectionString))
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>());

Сущность:

public class InspectionObject : IEntity<int>
{
    public virtual int ID { get; set; }

    public virtual Project Project { get; set; }
    public virtual InspectionObjectType Type { get; set; }

    public virtual User CreatedByUser { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual DateTime LastUpdated { get; set; }
    public virtual User LastUpdatedByUser { get; set; }

    public virtual string Littera { get; set; }
    public virtual string Owner { get; set; }
    public virtual string Address { get; set; }
    public virtual string Caretaker { get; set; }
    public virtual string Remarks { get; set; }
    public virtual float PlacementX { get; set; }
    public virtual float PlacementY { get; set; }
    public virtual float PlacementZ { get; set; }
}

Карта:

public class InspectionObjectMap : ClassMap<InspectionObject>
{
    public InspectionObjectMap()
    {
        Id(i => i.ID).Not.Nullable();
    }
}

Тест:

    [Test]
    public void IspectionObject_MappingsAreOK()
    {
        var dtenow = DateTime.Now;
        dtenow = new DateTime(dtenow.Ticks - (dtenow.Ticks % TimeSpan.TicksPerSecond), dtenow.Kind);

        var io = new InspectionObject
        {
            ID = 1,
            Project = Data.Project,
            Type = Data.InspectionObjectTypeVilla,
            CreatedByUser = Data.Consultant,
            Created = dtenow,
            LastUpdatedByUser = Data.UserConsultant1,
            LastUpdated = dtenow.AddHours(1),

            Littera = "15",
            Owner = "Fastighetsägare",
            Address = "Adress",
            Caretaker = "Fastighetsskötare",
            Remarks = "Anteckningar",

            PlacementX = 1F,
            PlacementY = 2F,
            PlacementZ = 3F
        };

        var session = IoC.Resolve<ISession>();

        new PersistenceSpecification<InspectionObject>.VerifyTheMappings(io);
    }

(да, у меня есть некоторые схемы экспорта / отбрасывания в моих подпрограммах SetUp и TearDown, но это все стандартно. Это просто слишком глубоко вложено в инфраструктуру тестирования, построенную вокруг этого приложения, для меня выкопать соответствующие кусочки, потому что это не делает ничего фантастического, просто в модных местах ...)

1 Ответ

2 голосов
/ 05 июля 2011

Я обнаружил, что пока я сопоставляю идентификатор, все работает.Это так и должно быть?Что действительно проверяет .VerifyTheMappings (сначала TEntity)?

Вы можете легко увидеть, как работает тест, посмотрев на его источник

Все VerifyTheMappings выглядят какпроверка заключается в том, может ли он зафиксировать и загрузить ваш объект (поэтому для него требуется только сопоставленный идентификатор).Если вы хотите проверить что-либо кроме того, можете ли вы сохранить или загрузить идентификатор, вы должны получить некоторые значения в списке allProperties этого объекта.Обычно это делается с помощью вызовов CheckProperty или CheckReference.VerifyTheMappings(T first) не делает ничего особенного для автоматического заполнения allProperties.Документация содержит следующий пример правильного использования:

public void CanCorrectlyMapEmployee()
{
    new PersistenceSpecification<Employee>(session, new CustomEqualityComparer())
        .CheckProperty(c => c.Id, 1)
        .CheckProperty(c => c.FirstName, "John")
        .CheckProperty(c => c.LastName, "Doe")
        .CheckReference(c => c.Store, new Store() {Name = "MyStore"})
        .VerifyTheMappings();
}
...