Используя MVC3 и EF4, как можно адекватно протестировать функциональность, которая полагается на обратную передачу в базу данных для создания значений IDENTITY? - PullRequest
1 голос
/ 13 октября 2011

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

Это происходит для серии записей одним и тем же методом.

Я высмеиваю мои ObjectContext и ObjectSets, поэтому текущий результат заключается в том, что каждой записи, "вставленной" в мой FakeObjectSet, присваивается первичный ключ 0.

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

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

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

Какова ваша цель для тестов?

0 голосов
/ 14 октября 2011

Вы можете добавить к вашему FakeObjectSet<T> событие, которое будет вызываться при вызове AddObject. Затем в своем тесте добавьте обработчик событий, чтобы установить Id добавляемого объекта.

Например, упрощенная версия набора поддельных объектов:

public class ObjectAddedEventArgs<T> : EventArgs
{
    public T Item { get; set; }
}

public class FakeObjectSet<T>
{
    private List<T> _list = new List<T>();

    public event EventHandler<ObjectAddedEventArgs<T>> ObjectAdded;

    public void AddObject(T item)
    {
        _list.Add(item);
        OnObjectAdded(item);
    }

    protected virtual void OnObjectAdded(T item)
    {
        EventHandler<ObjectAddedEventArgs<T>> h = AddingItem;
        if (h != null)
        {
            h(this, new ObjectAddedEventArgs<T> { Item = item });
        }
    }

    // other methods...
}

И в вашем тесте, когда вы хотите установить увеличивающееся значение Id, добавьте обработчик к вашему FakeObjectSet<T> и обновите Id объекта:

int id = 0;

FakeObjectSet<Foo> set = new FakeObjectSet<Foo>();
set.ObjectAdded += (s, e) => { e.Item.Id = id++; };
0 голосов
/ 13 октября 2011

Ваш фиктивный репозиторий может получить идентификатор из генератора идентификаторов (простой счетчик), который увеличивается с каждым последующим вызовом.

...