1

したがって、MSTest を使用する Testclass があり、1 つずつ実行するとすべてのテストがうまく機能しますが、2 つのテスト、つまり can_register と cannot_Register_existing_username を選択すると、2 つ目のテストは失敗します (cannot_register_existing_username)。

次のような抽象クラスからテストクラスを継承させました。

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 に残りますが、これは望ましくありません)。

上記のこのファイルをアクティブにすると、2 番目のテストが失敗し、テストは次のようになります。

[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 に答える