2016-04-07 16 views
0

Aşağıdaki tabloda, bir masanın dolu olup olmadığını kontrol eden bir örnek yöntem var. Bu benim ilk kez birim testleri yapıyor ve bir birim testinin sadece izolasyonda olduğunu ve bir veritabanında gerçekleştirilen herhangi bir eylemin alay edilmesi gerektiğini okuduğumu, aksi halde bir bütünleşme testi haline geldiğini okudum. Birisi beni doğru yönde gösterebilirse, bununla dalga geçmeyi nasıl başaracağımı tam olarak bilmiyorum. Örneğin, sınıf uygulamalıdır bir arabirimi oluşturmanız gerekecektir test birimi için bir yöntem dışarı alay etmek içinMS Access veritabanına bağlanan bir yöntem nasıl yapılır?

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; 
} 

cevap

1

: İkinci

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

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

, daha sonra örneği "enjekte" olmalıdır Örneğin ebeveyn çağıran kodun yöntemiyle veya sınıfa Arayüzü ait: Bu durumda, birim testleri yazmak ve dışarı alay etmek, böyle MOQ olarak alaycı bir çerçeve uygulayabilirsiniz

public class ExampleBusiness 
{ 
    private readonly IRepository repository; 

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

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

yo ur "isTableOccupied" yöntemi, örneğin:

// 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

Bu yöntemin başka bir yöntemle etkileşmemesi durumunda buna değeceğini düşünüyorsunuz? Bu yüzden, geri dönüş beni diğer yöntemlerle test etmekten alıkoymuyor. Bu yöntem için entegrasyon testine doğrudan gitmeli ve ünite testini atlamalı mıyım? – user5467760

+0

Tüm bu yöntemle dalga geçtiğimi hissediyorum "bool isTableOccupied" ("tableID") {return true} 'olarak değiştirir. Herhangi bir nokta var mı? ' – user5467760

+0

Kesinlikle her benzersiz senaryoya bağlıdır - sizin durumunuzda buna değmeyebilir, ancak bir arabirimin arkasındaki veri erişim kodunu soyutlamak genellikle iyi bir uygulamadır. Kod, kendiniz ve başkaları için gelecekte daha sürdürülebilir ve test edilebilir olacaktır. Doğruyu döndürme örneği sadece bir örnekti. Atanan belirli bir kimliğe bağlı olarak farklı değerler döndürmek için alay kurabilirsiniz. Dediğim gibi, her senaryo benzersizdir. Sadece değer katıyor ve değerli bir şey iddia ediyorsa test etmeliyim, genellikle bir entegrasyon testi daha yararlı olabilir. – abrown

İlgili konular