2012-06-25 3 views
2

이것은 매우 간단한 객체 지향 프로그래밍 문제입니다. 내가 뭘 하려는지 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#으로 전환하는 동안 이러한 문제가 발생합니다. 컴파일러는 어설 션에서 "할당되지 않은 변수 사용"이라고 말합니다. 그러나 위의 코드 블록 내에서 값을 할당한다고 생각했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

을 반환 (actreader, expcommand , dbconnection 등). 그들은 가치가 있고 잘 작동한다고 가정합니다. 실패한 주장입니다. – Brian

답변

2

actreader.Read()이 false를 반환 할 가능성이 있으므로 test2이 할당되지 않을 수 있으며 컴파일러 오류가 발생할 수 있습니다.

명시 적으로 null에 처음 & test2test1를 설정하여 문제를 해결할 수 있습니다

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

우수함,이 문제가 해결되었습니다! 그 길을 따라 또 다른 실수를 저지 렀지 만 나는 'Assert.AreSame'이라는 표현을 사용하여 두 객체가 이름인지 확인합니다. 내가해야 할 일은 데이터 값이 이름인지 확인하는 것입니다. 대신 'Assert.AreEqual'을 사용했으며 테스트가 완벽하게 작동합니다. 다시 한 번 감사드립니다! – Brian

1

당신은 if 블록 내에서 변수에 값을 할당한다. 로컬 변수는 기본값으로 초기화되지 않으므로 Assert 문에 변수에 값이 할당 될 때까지는 보장 할 수 없습니다. 다음 중

하나 이상이 일어나고 :

  • expreader.Read()
  • actreader.Read()false을 반환 값이 가정 변수를 용서하십시오 false
관련 문제