2015-12-02 70 views
1

我正在嘗試爲舊代碼創建單元測試(NUnit)。單元測試的最佳方式DbProviderFactory

我們使用DbProviderFactory檢查表中是否存在表之前,數據庫中存在。

我知道這看起來更像集成測試,但不管你怎麼稱呼它,我都需要對它進行測試。我寧願使用自包含的東西,而不依賴於數據庫。

我試圖使用Excel作爲我的數據源,但在Excel中選擇表應該有$後面的表名不會在我的情況下工作,因爲我不想修改我的代碼以適應單元測試。

我該如何單元測試下面的代碼?

static bool TableDoesNotExist(string tableName, string connectionString, string providerName = "System.Data.OleDb") 
    { 
     try 
     { 
      DbProviderFactory providerFactory = DbProviderFactories.GetFactory(providerName); 

      using (DbConnection conn = providerFactory.CreateConnection()) 
      { 
       conn.ConnectionString = connectionString; 
       conn.Open(); 

       DbCommand cmd = providerFactory.CreateCommand(); 
       cmd.Connection = conn; 

       string tblQuery = ""; 

       if (providerName == "System.Data.Odbc") 
        tblQuery = string.Format("SELECT COUNT(*) FROM SYSTABLE WHERE TABLE_NAME = '{0}'", tableName); 
       else 
        tblQuery = string.Format("SELECT COUNT(*) FROM [INFORMATION_SCHEMA.TABLES$] WHERE TABLE_NAME = '{0}'", tableName); 

       cmd.CommandText = tblQuery; 

       Console.WriteLine(cmd.CommandText); 

       DbDataReader dr = cmd.ExecuteReader(); 

       DataTable dt = new DataTable(); 
       dt.Load(dr); 

       if (dt.Rows.Count == 1 && Convert.ToInt32(dt.Rows[0][0]) == 0) 
       { 
        return true; 
       } 


      } 

      return false; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 

     return false; 
    } 

任何幫助,將不勝感激。

+0

您可以使用Shims來單元測試DbFactory。 –

+0

這是非常古老的代碼,它使用.NET 2.0不確定墊片是否可以工作。任何其他想法? – Farukh

回答

1

您可以嘗試使用存根一次。我用Stub編寫了一個簡單的測試用例。它按預期工作。下面是代碼:

[TestMethod] 
    public void Test01() 
    { 
     using (ShimsContext.Create()) 
     { 
      var dbConnectionOpened = false; 
      var fakeConnection = new StubDbConnection() 
      { 
       Open01 =() => { dbConnectionOpened = true; } 
      }; 
      var fakeCommand = new StubDbCommand() 
      { 
       ExecuteDbDataReaderCommandBehavior = (com) => GetFakeReader() 
      }; 
      var fakeDbProviderFactory = new StubDbProviderFactory() 
      { 
       CreateConnection01 =() => fakeConnection, 
       CreateCommand01 =() => fakeCommand 
      }; 
      ShimDbProviderFactories.GetFactoryString = (arg1) => fakeDbProviderFactory; 

      var val = SqlConnectionFactory.TableDoesNotExist("testTable", "conn"); 
      Assert.IsTrue(dbConnectionOpened); 
      Assert.IsTrue(val); 
     }    
    } 

    private DbDataReader GetFakeReader() 
    { 
     const int count = 0; 
     var dt = new DataTable("Test-Table"); 
     dt.Columns.Add(new DataColumn("Count")); 
     dt.Rows.Add(count); 
     return dt.CreateDataReader(); 
    } 


你可以玩的GetFakeReader()方法進行單元測試各種情景。

相關問題