TransactionScope не откатывается в тесте MSTest - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть следующий базовый объект в моих тестах

[TestClass]
public abstract class TestClassBase
{
    private TransactionScope _transactionScope;

    [TestInitialize]
    public virtual void TestInitialize()
    {
        _transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { Timeout = new TimeSpan(0, 10, 0) });
    }

    [TestCleanup]
    public virtual void TestCleanup()
    {
        _transactionScope.Dispose();
    }
}

У меня есть тест, который выполняет следующее

[TestMethod]
public void SaveToDatebaseTest(
{
     Program program = new Program();         
     program.Name = "Unit Test Program, I should not exists, when Test is done";
     ProgramManager programManager = new ProgramManager()
     programManager.Save(program);
}

Когда я запускаю тест, записи все еще существуют вбаза данных.

Я хочу избегать использования TransactionScope в каждом методе тестирования

Ответы [ 4 ]

3 голосов
/ 16 февраля 2011

Вам необходимо изменить метод TestCleanup, прямо сейчас вы избавляетесь от TransactionScope, я полагаю, что на самом деле выполняется неявный коммит? (вы могли бы подумать, что вам нужно будет вызывать Complete (), хотя?), поскольку ошибок нет, это не откат транзакции.

попробуйте это

[TestCleanup]
public virtual void TestCleanup()
{
    // using System.Transactions;
    Transaction.Current.Rollback();
    _transactionScope.Dispose();
}
1 голос
/ 08 ноября 2017

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

  • Entity Framework
  • Nunit (v3)

код ниже не будет работать.

class A
{
     private TransactionScope _trans;

     [SetUp]
     public void setup()
     {
        _trans = new TransactionScope();
     }

     [TearDown]
     public void done()
     {
        if(_trans != null)
          _trans.Dispose();
     }

     [Test]
     public void doSomeDbWrite()
     {
         //your code to insert/update/delete data in db
     }
}

Я пытался (и не работает) создавать TransactionScope перед созданием контекста БД или наоборот. Я думаю, что это как-то связано с самим EF, который, я полагаю, заключен в их собственных транзакциях или что-то в этом роде. я не копал глубже с этой стороны. в любом случае, вот как я это сделал с EF и транзакциями, чтобы убедиться, что ваша БД модульного теста чиста после того, как завершен модульный тест.

class A
{
     private DbContext_DB;
     private DbContextTransaction _trans;

     [SetUp]
     public void setup()
     {
        DB = new DbContext();//create your db context
        _trans = DB.Database.BeginTransaction();
     }

     [TearDown]
     public void done()
     {
        _trans.Rollback();
        DB = null;
     }
}

Надеюсь, это поможет другим, ищущим это сейчас: -)

0 голосов
/ 21 апреля 2015

Я думаю, что вы пытаетесь достичь здесь, создать общий класс Test, который реализует инициализацию и очистку, чтобы вам не приходилось повторять этот код для каждого теста, это правильно?Вы даже уверены, что эти методы даже вызваны?Имейте в виду, что вы не можете создавать подклассы [TestInitialize] и [TestCleanup], поэтому вам придется вызывать эти методы из подкласса.(См. https://stackoverflow.com/a/15946140/1638933).

0 голосов
/ 08 февраля 2011

Если вы используете VS2005 или VS2008 (не уверен насчет 2010 года), вы можете попробовать MSTestExtensions для автоматического отката транзакций базы данных после завершения методов тестирования.Я использовал его вместе с MS SQLServer и его службой координатора распределенных транзакций.

Я знаю, что это может быть не совсем то, что вы ищете, но это может помочь вашей ситуации.

...