【问题标题】:Cannot assert against object无法针对对象断言
【发布时间】:2012-06-27 06:23:36
【问题描述】:

这可能是一个非常简单的面向对象编程问题。我要做的是获取 2 个空对象,使用查询从数据库中提取数据,用查询返回的数据填充空对象,然后对它们进行断言。请看下面的代码:

        object test1;
        object test2;

        using (SqlConnection dbconnection = new SqlConnection(expconnstr))
        {
            dbconnection.Open();

            var expcommand = new SqlCommand(expectedquery, dbconnection);
            var actcommand = new SqlCommand(actualquery, dbconnection);

            using (SqlDataReader expreader = expcommand.ExecuteReader())
            {
                if (expreader.Read())
                {                        
                    test1 = expreader.GetValue(0);
                    expreader.Close();
                }
            }

            using (SqlDataReader actreader = actcommand.ExecuteReader())
            {
                if (actreader.Read())
                {
                    test2 = actreader.GetValue(0);
                    actreader.Close();
                }
            }
        }
        Assert.AreSame(test1, test2);

我按照相同的模式在 VB 中编写了一个非常相似的测试方法,并且 VB 代码执行得很好。但是,在从 VB 过渡到 C# 时,我遇到了诸如此类的问题。编译器在断言处说“使用未分配的变量”。但是,我以为我在上面的代码块中分配了一个值。我做错了什么?

【问题讨论】:

  • 请原谅假定具有值的变量(actreader、expcommand、dbconnection 等)。假定它们具有价值并且工作正常。失败的是断言。

标签: c# vb.net oop object


【解决方案1】:

actreader.Read() 返回 false 的可能性存在,因此 test2 可能永远不会被分配并且编译器错误。

您可以通过将test1test2 初始设置为null 来解决此问题:

object test1 = null;
object test2 = null;

【讨论】:

  • 太好了,这解决了问题!虽然我在此过程中犯了另一个错误.. 我使用的断言“Assert.AreSame”正在检查两个对象是否是名称。我需要做的是检查数据值是否是名称。相反,我使用了“Assert.AreEqual”,测试效果很好。再次感谢!
【解决方案2】:

您正在将值分配给if 块中的变量。由于局部变量未使用默认值初始化,因此无法保证在您到达Assert 语句时该变量已被赋值。

正在发生以下一件或多件事情:

  • expreader.Read() 正在返回 false
  • actreader.Read() 正在返回 false

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2022-05-01
    • 2022-04-20
    • 2023-02-22
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多