Новый DbContext помещает старые данные в базу данных - PullRequest
0 голосов
/ 13 мая 2019

Я тестирую бизнес-логику (в sqlserver db), используя автоматически сгенерированные DbContext и MSTest Framework.DbContext отображает только часть сущностей и используется в основном в контроллерах веб-API-данных.Шаблон тестирования:

protected U2Db Db; //auto-generated DbContext
protected DbContextTransaction CurrentTransaction;

[TestInitialize]
public void BeforeEveryTest(){
    Db = new U2Db();
    CurrentTransaction = 
       Db.Database.BeginTransaction(IsolationLevel.ReadCommitted);   
}

[TestMethod]
public void Method1() {
    var o = new Order() {Tag="Method1"};
    Db.Orders.Add(o);
    Db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist

    //checks inner db tables, service broker queues etc. 
    ....
}
[TestMethod]
public void Method2() {

    var o = new Order() {Tag="Method2"};
    Db.Orders.Add(o);
    Db.TrySave(); //wraps SaveChanges and reports errors if exist

    ....
}
[TestCleanup]
public void AfterEveryTest() {
    if (Db == null) return;
    try
    {
        if (CurrentTransaction != null)
        {
            CurrentTransaction.Rollback();
            CurrentTransaction.Dispose();
        }
    }
    catch (Exception e) { };

    Db.Dispose();
}

Если я запускаю какой-либо тест вручную, он работает как положено.Если я начну запускать серию тестов (последовательно, однопоточных), некоторые из них не пройдут.Что я вижу в Server Profiler, так это то, что транзакции работают должным образом, но при неудачных тестах база данных получает записи, которые использовались в ранее выполненных тестах, что заставляет меня чувствовать, что DbContext на самом деле не является «новым» экземпляром.Что я делаю не так?

1 Ответ

0 голосов
/ 13 мая 2019

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

[TestMethod]
public void Method1() {
    var db = new U2Db();
    var o = new Order() {Tag="Method1"};
    db.Orders.Add(o);
    db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist

    //checks inner db tables, service broker queues etc. 
    ....
}
...