2012-07-31 16 views
21
[TestMethod] 
public void TestMethod1() 
{ 
    var mock = new Mock<EmailService>(); 
    mock.Setup(x => x.SendEmail()).Returns(true); 
    var cus = new Customer(); 
    var result = cus.AddCustomer(mock.Object); 
    Assert.IsTrue(result); 
} 

public class Customer 
{ 
    public bool AddCustomer(EmailService emailService) 
    { 
     emailService.SendEmail(); 
     Debug.WriteLine("new customer added"); 
     return true; 
    } 
} 

public class EmailService 
{    
    public virtual bool SendEmail() 
    { 
     throw new Exception("send email failed cuz bla bla bla"); 
    } 
} 

EmailService.SendEmail yönteminin sahte olması için sanal olması gerekir. Sanal olmayan yöntemlerle uğraşmanın bir yolu var mı?Sanal olmayan yöntemler nasıl yapılır?

cevap

16

Ad, sanal olmayan yöntemlerle sınıflara alamıyor. IL'yi derlemenize takan veya EmailService'a bir arabirim yerleştiren ve bunu alay eden Type mock Isolator gibi diğer alay çerçeveleri kullanın.

4

Sanal yöntemlerin alay için kullanılmasının alternatifi arayüz kullanmaktır. Bu şekilde bütün bağımlılığı bozabilirsin.

public interface IEmailService 
{ 
    bool SendEmail(); 
    // etc... 
} 

public class EmailService : IEmailService 
{ 
    //... 
} 

Şimdi onun yöntemlerden herhangi alay izin arayüzünün IEmailService ait mocks oluşturabilir. Elbette, uygun olduğunda EmailService nesnelerini içeren IEmailService nesnelerini içeren değişken türlerini değiştirmeniz gerekecektir.

+0

Bu tekniği kullanmanın iyi olduğunu düşünüyorum ve arayüz kullanmanın kesinlikle avantajları var. Ancak, sanal olmayan bir yöntemin iki seçenek arasında değerlendirilebileceğini düşünürseniz: 1) sanallaştırın, 2) arabirimin bir parçası olarak kullanın, 2'nin 2'nin avantajı nedir? 2'yi seçseniz bile, artık bir arabirimin parçası olduğu için yöntemi sanal olarak etkin bir şekilde yapıyorsunuz demektir. – zumalifeguard

7

Sanal olmayan yöntemlerin kullanılması, düşük düzeyli profiler API'nın kullanılmasını içerir. Şu anda sadece seçenekler mevcuttur düşünüyorum:

hem JustMock olmayan sanal yöntemleri alay, bir lite edition olsa bile, ticari sadece ticari olarak mevcuttur sürümü. olarak projede Microsoft araştırmadan bir şey @aqwert olarak Pex and Moles

+5

Bence bu listeye Microsoft Moles/Pex/Fakes ekleyebilirsiniz. Bonus olarak ücretsiz. – podiluska

+0

Fakes, VS'nin açık basımına dahil değildir. –

1

olduğu yorumlarında işaret etti ve ekleme veya herhangi bir kod değiştirmeden Olmayan sanal yöntemleri alay etmek mümkün (ve oldukça kolay) var Typemock Isolator kullanırken @Felice yazdı Örneğin: i oluşturduk testi görebileceğiniz gibi

[TestMethod,Isolated] 
    public void TestMethod1() 
    { 
     var mock = Isolate.Fake.Instance<EmailService>(); 
     Isolate.WhenCalled(() => mock.SendEmail()).WillReturn(true); 
     var cust = new Customer(); 
     var result = cust.AddCustomer(mock); 
     Assert.IsTrue(result); 
    } 

oluşturmak çalıştı testine benzer.

İlgili konular