2009-08-03 2 views
0

У меня есть тест, который проходит, если я не отлаживать тест:Как избежать неудачного теста во время отладки?

Snippet:

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

В моей Аранжировке шаге я создал окурок, который будет возвращать сумму одну строки в информации. Часть, которая ломается во время отладки, является вызовом reader.Read(). Отладчик, как представляется, питается вызовом read() и оценивает значение false, никогда не входящее в область блока {}.

Так что же здесь происходит? Есть ли способ реорганизовать это?

По запросу тарелочек:

Полный рабочий тест:

[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

Я думаю, что это как-то связано с конфигурацией. Проверьте конфигурацию. –

+0

Спасибо за комментарии, @Pk не уверен, что проверить, все выглядит нормально. @weiqure Вы не можете пройти через без приложения отладчика, что является условием описываемого сценария. Протестируйте PASSES, когда я не отлаживаю. –

ответ

1

Я думаю, что один из объектов в вашей заглушке выполняются в отладчик и есть данные.

Удостоверьтесь, что все ваши имущественные геттеры свободны от побочных эффектов, и все должно быть хорошо.

Если это не так, пожалуйста, напишите какой-нибудь код - в идеале короткую, но полную программу, которая воспроизводит проблему.

+0

Будет проверять наличие побочных эффектов от свойств, спасибо Jon. –

0

Некоторые спекуляции:

При работе под отладчика режим отладки SQL Server включены? Uou может изменить это при запуске отладчика при использовании attach. Я считаю, что иногда это может сыграть ад с моими сессиями sql (не говоря уже о замедлении их).

Альтернативно, что ваши издевательские инструменты не любят работать в многопоточном режиме? Что произойдет, если вы попробуете только один тест на своем собственном с/без отладчика?

+0

Спасибо Shuggy. Отладка SQL не включена, однако это уже существующий интеграционный тест, который я пытаюсь уговорить в единичном тесте путем издевательских ответов по всем векторам dbutility. Здесь нет вообще никаких вызовов. Издевательским инструментом может быть преступник. Мой следующий шаг - устранить насмешку и посмотреть, соответствовал ли исходный тест аналогичным образом. –

Смежные вопросы