2014-11-18 3 views
1

У меня есть базовый класс для моих модульных тестов:Unit Test с транзакцией: CREATE DATABASE заявление не допускается в транзакции с несколькими операторами

public abstract class DatabaseTestsBase 
{ 
    protected OvuContext DbContext; 
    protected TransactionScope TransactionScope; 

    [SetUp] 
    public void TestSetup() 
    { 
     TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew); 

     DbContext = new OvuContext("IntegrationTestContext"); 
    } 

    [TearDown] 
    public void TestCleanup() 
    { 
     TransactionScope.Dispose(); 
    } 
} 

И сам тест:

[TestFixture] 
public class MyEntityTests : DatabaseTestsBase 
{ 
    [Test] 
    public void MyEntity_Create_HasSucceeded() 
    { 
     var myEntity = new MyEntity(Guid.NewGuid()); 
     myEntity.Description = "bla bla bla"; 
     var id = myEntity.Id; 

     DbContext.MyEntities.Add(myEntity); 
     DbContext.SaveChanges(); 

     var temp = DbContext.MyEntities.Single(x => x.Id == id); 

     ComparisonResult result = CompareLogic.Compare(myEntity, temp); 

     Assert.True(result.AreEqual); 
    } 
} 

я получил следующее ошибка при запуске теста: Операция CREATE DATABASE не допускается в рамках транзакции с несколькими операциями

«Странно», что когда я запускаю тест второй время, оно проходит.

ответ

2

Я считаю, что вы принимаете шаблон отката базы данных боковой осуществления интеграции тесты/Unit сделано под несовершенными сделками (например, TransactionScope) немного далеко :)

Code First EF пытается создать базу данных в контексте окружающей среды TransactionScope, что невозможно.

На сервере Sql (и, возможно, других РСУБД) it isn't possible to execute certain statements, например CREATE DATABASE, команда под транзакцией. Вы получите ту же ошибку, если выполнить следующие непосредственно в SSMS:

use master; 

BEGIN TRAN 
CREATE DATABASE FOO; 
-- CREATE DATABASE statement not allowed within multi-statement transaction. 

Я хотел бы предложить вам изменить свою стратегию такого, что вы заранее создать постоянную пустую тестовую базу данных для тестирования. Другие заявления DDL, выполняемые кодом EF Сначала, например, CREATE TABLE, можно откатить с помощью незафиксированного TransactionScope.

+0

Я не создаю новую базу данных, это уже существующая, которую я использую – Filip

+1

Ну, по какой-либо причине, при первом запуске UT EF обнаруживает, что БД отсутствует. Проверьте строки подключения? – StuartLC

+0

приложение app.config в модульном тестовом проекте имеет правильную строку соединения – Filip