2010-07-20 1 views
0

У меня есть классы обслуживания на основе Entity Framework 4. Я бы хотел протестировать их в базе данных, заполненной предварительно сгенерированными данными образца. Проблема в том, что я хотел бы, чтобы тесты, прошедшие или не прошедшие проверку, фактически не касались базы данных, чтобы ее можно было повторно использовать для других тестов.Возможно ли предотвратить запись EF SaveChanges() в БД?

Таким образом, мне бы хотелось, чтобы ObjectContext.SaveChanges притворился, что все в порядке, и сохраняйте изменения в памяти, но молча игнорируйте их фактическое сохранение в источнике данных. Это возможно?

P.S. Я знаю шаблон репозитория, но не хотел бы использовать его в этом случае.

+0

Зачем беспокоиться даже о вызове SaveChanges, если вы не проверяете его влияние на уровень данных? –

+0

Да, у меня была такая же идея :-) Может быть, флаг, переданный конструктору службы, может быть. Жаль, что такие вещи, как DRI, не будут проверены, но я полагаю, что нет возможности проверить их, не попав в БД. –

ответ

0

Я собираюсь выйти на конечности здесь с этим ... Я знаю, что он работает с LINQ-to-SQL

Вы можете переопределить метод SaveChanges в вашем контексте/контейнер

и фактически удалите base.SaveChanges();

Это выглядит следующим образом:

public override int SaveChanges(SaveOptions options){ 
    return base.SaveChanges(); 
} 

так что если вы раскомментировать эту строку, вы можете адаптировать его к вашей ситуации

+0

Спасибо, попробуем это. (Или, может быть, просто следуйте указанному выше маршруту ...) –

+0

Комментируя или раскомментируя строку для модульных тестов, кажется мне ужасной идеей ... что, если вы забудете раскомментировать вызов 'base.SaveChanges', прежде чем перейти к производство? Вы должны * никогда не изменять код, который вы тестируете только для целей тестирования. Лучше всего было бы создать конкретный объект ObjectContext для тестов, где вы бы переопределили 'SaveChanges'. Но даже это не является хорошим решением, потому что изменения, внесенные в объект ObjectContext, не отображаются в запросах, пока вы не назовете «SaveChanges» –

1

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

using(var context = new MyObjectContext()) 
{ 
    context.Connection.Open(); 
    using (var transaction = context.Connection.BeginTransaction()) 
    { 
     // Your tests here 
     ... 

    } // At this point, the transaction is rolled back, since it hasn't been commited 
} 
Смежные вопросы