如何在调试期间避免测试失败?

时间:2009-08-03 16:14:15

标签: c# debugging heisenbug

如果我没有调试测试,我会通过测试:

段:

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

在我的编排步骤中,我设置了一个存根,它将返回一行的信息。在调试期间中断的部分是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 个答案:

答案 0 :(得分:1)

我的猜测是你的存根中的一个属性正在调试器中执行,并且正在吃数据。

确保你所有的财产获取者都没有副作用,一切都很好。

如果不是这样,请发布一些代码 - 理想情况下是一个简短但完整的程序,可以重现问题。

答案 1 :(得分:0)

一些猜测:

在调试器下运行时是否包含sql server调试模式?如果使用attach,则可以在启动调试器时更改此设置。我发现这有时会在我的sql会话中发挥作用(更不用说放慢速度了)。

或者你的模拟工具不喜欢以多线程方式运行吗? 如果您在使用/不使用调试器的情况下尝试使用一个测试会发生什么?