Как избежать провала теста во время отладки? - PullRequest
0 голосов
/ 03 августа 2009

У меня есть тест, который проходит, если я не отлаживаю тест:

Отрывок:

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

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

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

По запросу от Skeet:

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

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

Ответы [ 2 ]

1 голос
/ 03 августа 2009

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

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

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

0 голосов
/ 03 августа 2009

Некоторые предположения:

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

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

...