ExecuteReader:CommandText属性尚未初始化;但页面加载得很好?

时间:2014-08-25 14:29:41

标签: c# unit-testing sqlcommand

我有一个MVC设置,Controller的Index()方法启动对数据库的查询,然后数据库被序列化为JSON并返回到View。几乎每个控制器仅用于显示数据,因此有多种这样的方法。举个例子:

public string getSalesReport()
{
    return queryForJsonResult(ConfigurationManager.AppSettings["RetrieveSalesReport"]);
}

方法是否运行。传递给它的appSetting是查询(绝对正确)。然后,此方法执行以下操作:

private string queryForJsonResult(string query)
{
    SqlConnection connection = new SqlConnection(_connectionString);
    connection.Open();

    SqlCommand command = new SqlCommand(query, connection);
    SqlDataReader result = command.ExecuteReader();

    string jsonResult = bufferedResultBuilder(result);

    connection.Close();

    return jsonResult;
}

private string bufferedResultBuilder(SqlDataReader result)
{
    // Takes a result set and uses a buffer to build a JSON string.
    StringWriter stringWriter = new StringWriter(new StringBuilder());
    JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter);
    jsonTextWriter.WriteStartArray();

    while (result.Read())
    {
        jsonTextWriter.WriteStartObject();
        for (int i = 0; i < result.FieldCount; i++)
        {
            jsonTextWriter.WritePropertyName(result.GetName(i));
            jsonTextWriter.WriteValue(result[i]);
        }

        jsonTextWriter.WriteEndObject();
    }

    jsonTextWriter.WriteEndArray();

    return stringWriter.ToString();
}

所以它需要结果集并从中构建一个JSON字符串,一次一个条目。当我运行项目时,所有这些似乎工作正常,数据正确加载。我还有单元测试,利用Stopwatch来测试这些Controller方法运行的时间。但是,当我运行单元测试时,这个特定条目会出现错误:

  

结果消息:测试方法   Dashboard.Tests.BenchmarkTests.salesOverviewLoadTime抛出异常:   System.InvalidOperationException:ExecuteReader:CommandText属性   尚未初始化

查询肯定是正确的,并且还有其他几个非常相似的示例,它们仅在输入的初始查询中有所不同。所有这些方法都运行得很好。此错误的堆栈跟踪将其追溯到queryForJsonResult()SqlCommand.ExecuteReader(),但就像我说的那样,它仅用于显示视图的许多非常类似的方法之一。

为什么实际加载数据的一个查询在单元测试时会出现错误?单元测试的设置几乎完全相同,除了加载的控制器和所有其他的工作正常。

1 个答案:

答案 0 :(得分:1)

这个问题对我来说仍然很奇怪。正如@MichaelLiu指出的那样,我的.config文件没有相同的appSettings。我复制了包含我的查询的所有appSettings,这解决了这个问题。但是,这并不一定能解释为什么所有其他查询都能正常工作。我想我可能在处理代码异常的方式上有一点不同,例如。

try {} catch {return;}
return;

而不是

try {
    return;
} catch {
    return;
}

虽然return不应该出现任何问题。

在任何情况下,解决方案都是确保您的项目及其单元测试对应方根据需要具有相同的.config规范。