2012-06-25 44 views
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#时,我遇到了这些问题。编译器在assert中说“使用未分配的变量”。但是,我认为我在上面的代码块中分配了一个值。我究竟做错了什么?

+0

请原谅这被假定为有值的变量(actreader,expcommand ,dbconnection等)。他们被认为具有价值并且工作良好。这是主张失败。 – Brian

回答

2

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

您可以通过显式设置test1 & test2最初null解决这个问题:

object test1 = null; 
object test2 = null; 
+1

优秀,这解决了问题!虽然我一路上犯了另一个错误,但我使用的断言'Assert.AreSame'正在检查两个对象是否是名称。我需要做的是检查数据值是否是名称。相反,我使用了“Assert.AreEqual”,测试完美无缺。再次感谢! – Brian

1

您的if块内分配值的变量。由于局部变量未使用默认值进行初始化,因此不能保证在您到达Assert语句时该变量已被赋值。

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

  • expreader.Read()正在恢复false
  • actreader.Read()正在恢复false