Entity Framework TDD, модель юнит-теста для обязательного поля - PullRequest
3 голосов
/ 19 сентября 2011

Я начинаю использовать TDD для следующего класса, используя Entity Framework 4.1:

    public class Agent
    {
        // Primary key
        public int ID { get; set; }

        [Required]
        public string Name { get; set; }

        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string Phone1 { get; set; }
    }

Мое утверждение не будет выполнено:

    /// <summary>
    ///A test for Agent Constructor need have name
    ///</summary>
    [TestMethod()]
    public void AgentConstructorTest()
    {
        Agent target = new Agent();
        Assert.IsNull(target);
    }

Когда я смотрю на сгенерированный целевой объект, он создается с идентификатором = 0. Как я могу проверить, что тогда требуется Name?

А если поле Name является обязательным, как я все еще могу создать объект Agent? Когда будет присвоен реальный идентификатор? Чтобы протестировать саму модель, нужно ли создать / макет DbContext, чтобы иметь возможность назначить идентификатор?

1 Ответ

5 голосов
/ 19 сентября 2011

Имейте в виду, что здесь вы имеете дело только с классами POCO - не происходит никакой магии, которая позволила бы сбою конструкции класса Agent только потому, что вы поместили пользовательский атрибут в одно из его свойств.

Платформа сущностей проверяет наличие пользовательских атрибутов во время проверки и сопоставления данных - в этом случае она проверяет атрибут Required и объявляет сущность как «действительную», если соответствующее строковое свойство не равно нулю итакже он сопоставит имя с необнуляемым столбцом в базе данных.

Чтобы отразить, что вы могли написать пользовательскую процедуру проверки в модульном тесте, которая выполняет те же проверки, т.е.что все свойства, которые украшены атрибутом Required, действительно имеют значение, то есть что-то вроде этого:

[TestMethod()]
public void AgentWithNoNameIsInvalid()
{
    Agent target = new Agent();

    Assert.IsFalse(IsValid(target));
}

Это похоже на то, что вы сейчас тестируете EF, а не свой код.

Поскольку идентификатор является вашим первичным ключом, он будет назначен только тогда, когда объект будет зафиксирован в базе данных.Так что да, для полного тестирования вы должны будете смоделировать единицу работы и контекст, который делает это и для вас.Хотя есть много подводных камней и тонких (и не очень тонких) различий между IQueryable<T> и IEnumerable<T>, которые делают этот подход очень хрупким.

Лично я бы рекомендовал вам провести интеграционное тестирование с EF на основе отдельного тестабазу данных с известным содержанием и напишите свои модульные тесты и ожидаемые результаты на основе этой тестовой базы данных - это может быть не совсем TDD, но я обнаружил, что это единственный способ убедиться, что я проверяю правильные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...