1

所以我有一个使用 MSTest 的 Testclass,如果我一个一个地运行它们,每个测试都很好,但是如果我选择 2 个测试,即 can_register 和 can_register_existing_username,那么第二个测试失败(cannot_register_existing_username)。

我让我的 testclass 从一个看起来像这样的抽象类继承:

public abstract class RollbackCapabilities

{

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()
    {
        Transaction.Current.Rollback();
        _transactionScope.Dispose();
    }

}

如果我将此文件注释掉,那么它可以工作(但现在数据保留在我不想要的 test-db 中)。

使用上面的这个文件,第二个测试失败,测试看起来像这样

[TestMethod]
    public void Can_Register()
    {
        //Arrange
        AccountController ac = ControllerFactory.CreateAccountController();
        RegisterModel model = new RegisterModel();
        model.UserName = "TestUser";
        model.Password= "TestPassword";
        model.ConfirmPassword = "TestPassword";

        //Act
        ActionResult result = ac.Register(model);

        //Assert
        Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
        Assert.AreEqual("Home", ((RedirectToRouteResult)result).RouteValues["controller"]);
        Assert.AreEqual("Index", ((RedirectToRouteResult)result).RouteValues["action"]);
    }

    [TestMethod]
    public void Cannot_Register_Existing_Username()
    {
        //Arrange
        AccountController ac = ControllerFactory.CreateAccountController();
        RegisterModel model = new RegisterModel();
        model.UserName = "TestUser";
        model.Password = "TestPassword";
        model.ConfirmPassword = "TestPassword";
        ac.Register(model);
        RegisterModel model2 = new RegisterModel();
        model2.UserName = "TestUser";
        model2.Password = "OtherTestPassword";
        model2.ConfirmPassword = "OtherTestPassword";

        //Act
        ActionResult result = ac.Register(model2);

        //Assert
        Assert.IsInstanceOfType(result, typeof(ViewResult));
        Assert.AreEqual("", ((ViewResult)result).ViewName);
        Assert.AreEqual(model2, ((ViewResult)result).ViewData.Model);
    }

最后我得到的错误如下:

测试方法 Viducate.UnitTests.UserHandling.RegisterTests.Cannot_Register_Existing_Username 抛出异常:System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:对象名称“dbo.Users”无效。

那是我的问题,不是很大但很烦人,正如我提到的,如果我一次又一次地运行测试它可以工作,它也可以工作,但如果我注释掉我的 RollbackCapabilities 类,它会在数据库中留下数据

4

1 回答 1

0

好的,所以我发现我的错误是我手动创建了数据库(但不是表),因为多事务不支持创建数据库。

但是,创建一个空数据库意味着 EF 假定已经有表,这就是它失败的原因,不知道 dbo.users 是什么。

所以我所做的就是创建了表格,现在它可以工作了。然而,这意味着如果不先创建表和数据库,我永远无法在新的开发机器上运行它。很烦人。

我想我将设置另一个不继承我的抽象回滚类的测试类和永久创建表的哈德......只要首先运行就应该解决问题。

于 2013-03-23T16:53:45.407 回答