したがって、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 クラスをコメントアウトすると、動作しますが、データベースにデータが残ります