2009-08-03 4 views
0

J'ai un test qui passe si je ne suis pas mise au point le test:Comment éviter les échecs du test pendant le débogage?

Snippet:

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

Dans mon Arrangez pas, je mis en place un talon qui renverra une la valeur de ligne d'informations. La partie qui se casse pendant le débogage est l'appel reader.Read(). Le débogueur apparaît à mange l'appel read() et l'évalue à false, n'entrant jamais dans la portée du bloc while {}.

Alors, que se passe-t-il ici? Y a-t-il un moyen de refactoriser cela?

Sur demande de Skeet:

test de travail complet:

[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); 
} 

code à l'essai:

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

L'assembly que vous avez créé avec la configuration de débogage fonctionne-t-il si vous l'exécutez sans le débogueur connecté? – weiqure

+0

Je pense que cela a quelque chose à voir avec la configuration. Vérifiez votre config. –

+0

Merci pour les commentaires, @Pk ne sais pas quoi vérifier, tout semble bien. @weiqure Vous ne pouvez pas passer à travers sans le débogueur joint, ce qui est une condition du scénario que je décris. Tester PASSES lorsque je ne débogue pas. –

Répondre

1

Je pense que l'une des propriétés de votre talon est exécuté dans la débogueur, et manger les données.

Assurez-vous que tous vos getters de propriété sont sans effets secondaires et tout devrait bien se passer.

Si ce n'est pas le cas, veuillez poster du code - idéalement un programme court mais complet qui reproduit le problème.

+0

Va vérifier les effets secondaires des propriétés, merci Jon. –

0

Quelques spéculations:

Lors de l'exécution sous le débogueur est le mode de débogage du serveur SQL inclus? Vous pouvez modifier cela en lançant le débogueur si vous utilisez attach. Je trouve que cela peut parfois jouer à l'enfer avec mes sessions sql (sans parler de les ralentir).

Alternativement, vos outils de simulation ne veulent pas être exécutés de manière multi-thread? Que se passe-t-il si vous essayez ce test seul avec ou sans le débogueur?

+0

Merci Shuggy. Le débogage SQL n'est pas activé, cependant, il s'agit d'un test d'intégration existant que j'essaye d'amadouer dans un test unitaire en se moquant des réponses le long de tous les vecteurs de faiblesse. Aucun appel de DB ici du tout. Les outils moqueurs pourraient être le coupable. Ma prochaine étape est d'éliminer les moqueries et de voir si le test original s'est comporté de manière similaire. –

Questions connexes