【问题标题】:Unit Test with transaction: CREATE DATABASE statement not allowed within multi-statement transaction带有事务的单元测试:多语句事务中不允许创建数据库语句
【发布时间】:2014-11-19 03:25:13
【问题描述】:

我的单元测试有基类:

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 语句

“奇怪”的是,当我第二次运行测试时,它通过了。

【问题讨论】:

    标签: entity-framework unit-testing transactions


    【解决方案1】:

    我相信您在未提交的事务(例如 TransactionScope)下完成回滚数据库副作用集成/单元测试的模式有点远:)

    Code First EF 正在尝试在环境 TransactionScope 的上下文中创建数据库,这是不可能的。

    在 Sql Server(可能还有其他 RDBMS)中,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.
    

    我建议您更改策略,以便预先创建一个永久的空测试数据库进行测试。 EF Code First 执行的其他 DDL 语句,如CREATE TABLE 可以被未提交的TransactionScope 回滚。

    【讨论】:

    • 我没有创建新数据库,它是我使用的现有数据库
    • 好吧,不管什么原因,第一次运行 UT 时,EF 检测到 DB 丢失。检查您的连接字符串?
    • 单元测试项目的app.config有正确的连接字符串
    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多