MySQL Connectorを使用し、EntityFramework 4.3を使用して、MySQL 5.5.19 DBに対していくつかの自動テストを実行するためにMSTestを使用しています。テストでネストされたTransactionScopeが失敗する
DBアクセスのクラスライブラリでTransactionScope
を使用して、必要なときにロールバックを実行しようとしています。さらに、私のテストコードでは、TransactionScope
を使用して、各テストの前にDBを既知の状態に戻したいと考えています。私はこれを達成するためにTestInitialize
とTestCleanup
メソッドを使用します。これらはそうのように見える:初期化関数でありTransactionScope
オブジェクトの構築に基づいて
[TestInitialize()]
public void MyTestInitialize()
{
testTransScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}
[TestCleanup()]
public void MyTestCleanup()
{
Transaction.Current.Rollback();
testTransScope.Dispose();
}
、私は(そう、既存の「周囲」1が存在しない、私は信じて、私は新しいトランザクション・スコープを取得しなければならないと考えていますこの ".RequiresNew"は、 ".Required"は同じ結果を生成するので、ここでは技術的に重要ではありません。タイムアウト値を指定しないので、デフォルトタイムアウトが与えられます。
私はAddDessert(DessertBiz dessertBizObject)
という名前の関数を持っています。この関数の一部は次のようになります:
using (var transScope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
// ...
context.Desserts.Add(dessert);
context.SaveChanges();
var dessertId = dessert.Id;
DoOtherDessertStuff(dessertId, dessertBizObject);
transScope.Complete();
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
この関数は、私のテストの1つによって呼び出されます。
ここではTransactionScopeOption.Required
を指定しているので、MyTestInitialize
関数で作成された「アンビエント」トランザクションスコープが使用されることを期待しています。
私のテストが失敗し、例外をスローするには、このDoOtherDessertStuff
機能するように配置されているので、transScope.Complete();
への呼び出しが起こらないとAddDessert
機能でusing
ブロックの終了時にロールバックが自動的に行われます。
MyTestInitialize
関数で作成されたアンビエントトランザクションスコープを使用しているため、私のテストAssert
コールはトランザクションスコープロールバックが起きたために発生しません - 少なくともこれが起こっていると思います。 Transaction.Current.TransactionInformation.Status
がTransactionStatus.Abortedであることを確認しましたので、これが起こっているかどうかはかなり確信しています。
グレートので、私はいくつかの私のusing
行はこのように見えます見えます、私はまさに私が巣トランザクション・スコープではなく、周囲のいずれかを使用することを除き、上記のように見えるために私AddDesert
方法を変更するだろうと思った:
using (var transScope = new TransactionScope(TransactionScopeOption.RequiresNew))
を
ここでの目的は、これらのトランザクションスコープをネストすることができ、プロダクションコードのロールバックを発生させてから、自分のテストコードでAssert
をチェックすることでした。
しかし、私が見つけています、私は次のエラーを取得することです:
System.IO.IOException:トランスポート接続からデータを読み取ることができません:接続先が適切に応答しなかったため、接続に失敗しました接続されたホストが応答しなかったために確立された接続が失敗しました。
アイデア?
それが起こるスタックトレースとコードを投稿してください。 – usr