2009-08-03 7 views
0

私の並べ替えステップでデバッグ中にテストが失敗するのを避けるには?</p> <p>スニペット::私はテストをデバッグするわけではない場合は合格テストしてい

using (var reader = dbUtility.ExecuteReader(cmd)) 
{ 
    if (reader != null) 
    { 
     while (reader.Read()) 
     { 

を、私は1行の情報の価値を返しますスタブを設定します。デバッグ中にのみ壊れる部分は、reader.Read()呼び出しです。デバッガはと表示され、read()コールはとなり、評価はfalseになり、while {}ブロックのスコープには入力されません。

ここで何が起こっていますか?これをリファクタリングする方法はありますか?スキートからの要求により、

完全に動作テスト:テストの下

[Test] 
public void StateValueTest() 
{ 
    // Borrowed from Phil Haack 
    StubResultSet resultSet 
     = new StubResultSet("stateid", "stateabbr", "statename", "regionid"); 
    resultSet.AddRow(1, "CA", "California", 0); 
    StubDataReader mockReader = new StubDataReader(resultSet); 

    // Using Kzu's Moq framework <3 
    var mockDbUtil = new Mock<IDbUtility>(); 
    mockDbUtil.Setup(conn => conn.GetSqlConnection()); 
    mockDbUtil.Setup(cmd => cmd.CreateSqlProcCommand(It.Is<string>(procName => procName == "spGetStates"), It.IsAny<SqlConnection>())); 
    mockDbUtil.Setup(exec => exec.ExecuteReader(It.IsAny<SqlCommand>())).Returns(mockReader); 

    State.dbUtility = mockDbUtil.Object; 

    List<State> states = State.States; 

    mockDbUtil.VerifyAll(); 

    Assert.Less(0, states.Count); 
} 

コード:

public static List<State> States 
{ 
    get 
    { 
     List<State> results = new List<State>(); 

     using (var conn = dbUtility.GetSqlConnection()) 
     { 
      using (var cmd = dbUtility.CreateSqlProcCommand("spGetStates", conn)) 
      { 
       using (var reader = dbUtility.ExecuteReader(cmd)) 
       { 
        if (reader != null) 
        { 
         while (reader.Read()) 
         { 
          State state = new State 
          { 
           stateId = ConversionUtility.ConvertInt(reader["stateid"]), 
           stateAbbr = ConversionUtility.ConvertString(reader["stateabbr"]), 
           stateName = ConversionUtility.ConvertString(reader["statename"]), 
           regionId = ConversionUtility.ConvertInt(reader["regionid"]) 
          }; 
          results.Add(state); 
         } 
        } 
       } 
      } 
     } 

     return results; 
    } 
} 
+0

デバッガが接続されていない状態で実行すると、デバッグ構成で作成したアセンブリは機能しますか? – weiqure

+0

これはconfigと関係があると思います。設定を確認してください。 –

+0

コメントのおかげで、 @Pkは何を確認するか分からない、すべてがうまく見えます。 @weiqureデバッガを接続せずにステップスルーすることはできません。これは私が記述しているシナリオの条件です。私がデバッグしていないときにパスをテストしてください。 –

答えて

1

私の推測では、あなたのスタブのプロパティの1がで実行されているということですデバッガ、およびデータを食べる。

すべてのプロパティゲッターが副作用がなく、すべてが正常であることを確認してください。

これはそうでない場合は、いくつかのコードを投稿してください - 理想的には問題を再現する短い完全なプログラムです。

+0

プロパティの副作用をチェックします.Jonさんに感謝します。 –

0

いくつかの憶測:

は、デバッガの下で実行されているSQL Serverのデバッグモードが含まれていますか? attachを使用している場合、デバッガの起動時にこれを変更できます。私はこれが時々私のSQLセッション(それらを遅くすることは言うまでもありません)で地獄を演じることができることを発見します。

また、モッキングツールがマルチスレッドで実行されたくないということですか? デバッガの有無にかかわらず、その1つのテストだけを実行しようとするとどうなりますか?

+0

ありがとうShuggy。 SQLデバッグは有効になっていませんが、これは既存の統合テストです。これは、すべてのdbutilityベクトルに沿ってレスポンスを嘲笑することでユニットテストに同軸化しようとしています。 DBの呼び出しはまったくありません。嘲笑の道具が犯人かもしれない。私の次のステップは、嘲笑を排除し、元のテストが同様に動作するかどうかを確認することです。 –