2016-04-07 173 views
0

我有一個示例方法,它檢查表是否被佔用。這是我第一次進行單元測試,並且認爲單元測試只是單獨編碼,並且應該嘲笑在數據庫上執行的任何操作,否則它將成爲集成測試。我不太清楚如何去嘲笑這個,如果任何人都能指出我的正確方向。如何模擬連接到MS Access數據庫的方法

public bool isTableOccupied(string tableID) 
{ 
    bool tableOccupied = false; 
    try 
    { 
     connection.Open(); 
     using (OleDbCommand command = new OleDbCommand()) 
     { 
       command.Connection = connection; 
       command.CommandText = "SELECT [Occupied] FROM [Table] WHERE [TableID] [email protected]"; 
       command.Parameters.AddRange(new OleDbParameter[] { 
        new OleDbParameter("@TableID", tableID) 
        }); 
        OleDbDataReader reader = command.ExecuteReader(); 

        while (reader.Read()) 
        { 
         if (reader["Occupied"].ToString() == "True") 
         { 
          tableOccupied = true; 
         } 
        } 
      } 
      connection.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error " + ex); 
     } 
     return tableOccupied; 
} 

回答

1

爲了嘲笑的方法進行單元測試,你將需要建立一個類應該實現一個接口,例如:

public interface IRepository 
{ 
    bool IsTableOccupied(string tableId); 
} 

public class ExampleRepository : IRepository 
{ 
    public bool IsTableOccupied(string tableID) 
    { 
     // Your data access code goes here. 
    } 
} 

其次,你應該再「注入」實例接口到父調用代碼的方法或類,例如:

public class ExampleBusiness 
{ 
    private readonly IRepository repository; 

    public ExampleBusiness(IRepository repository) 
    { 
     this.repository = repository; 
    } 

    public bool IsTableOccupied(string tableId) 
    { 
     return this.repository.IsTableOccupied(tableId); 
    } 
} 

然後可以寫單元測試和實現一個模擬框架,如Moq的,模擬出喲例如:ur「isTableOccupied」方法,例如:

// Create mock. 
var mockRepository = new Mock<IRepository>(); 

// Setup to return the desired mock value. In this case, return true if any string tableId is provided. 
mockRepository.Setup(x => x.IsTableOccupied(It.IsAny<string>())).Returns(true); 

// Call the parent method and inject the mock. 
var testBusiness = new ExampleBusiness(mockRepository.Object); 

// Finally, assert that the value is as expected. 
Assert.IsTrue(testBusiness.IsTableOccupied("TestId"); 
+0

如果此方法不與任何其他方法交互,您認爲這是否值得?所以它的返回並不妨礙我單元測試其他方法。我應該直接進行這種方法的集成測試並跳過單元測試嗎? – user5467760

+0

所有我覺得嘲笑這種方法做的是改變它'布爾isTableOccupied(「tableID」){返回true}'。有沒有什麼意思?' – user5467760

+0

它當然取決於每一個獨特的場景 - 它可能不值得你的情況,但通常好的做法是抽象出接口後面的數據訪問代碼。代碼將在未來爲您自己和其他人提供更好的可維護性和可測試性。我給出的返回true的例子只是一個例子。你可以設置模擬返回不同的值,取決於提供的特定ID。正如我所說,每個場景都是獨一無二的。我只會說,只有測試它是否增加了價值並聲稱有價值的東西,通常集成測試可能會更有用。 – abrown

相關問題