2012-07-31 12 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"); 
    } 
} 

Metoda musi być wirtualna, aby ją sfałszować. Czy istnieje sposób na pozorowanie nie-wirtualnych metod?Jak wyśmiać metody inne niż wirtualne?

Odpowiedz

16

Moq nie może kpić z nie-wirtualnych metod na zajęciach. Albo użyj innych szyderczych struktur, takich jak Type mock Isolator, które w rzeczywistości wplatają IL do twojego zespołu lub umieszczają interfejs na EmailService i kpią z tego.

4

Alternatywą do stosowania metod wirtualnych do kpiny jest użycie interfejsów. W ten sposób możesz wyśmiewać całą zależność.

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

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

Teraz można tworzyć mocks interfejsu IEmailService pozwolić drwicie któregokolwiek z jej metod. Oczywiście, w razie potrzeby będziesz musiał zmienić typy zmiennych zawierających obiekty EmailService na IEmailService.

+0

Myślę, że stosowanie tej techniki jest dobre, a korzystanie z interfejsów jest z pewnością korzystne. Ale jeśli oceniasz między dwiema opcjami, aby metoda inna niż wirtualna była możliwa do opanowania: 1) uczyń ją wirtualną, 2) użyj jej jako części interfejsu, jaka jest przewaga 2 nad 1? Nawet jeśli wybierzesz 2, efektywnie uczynisz metodę wirtualną, ponieważ jest ona teraz częścią interfejsu. – zumalifeguard

7

Prześmiewanie metod niewerbalnych wymaga użycia interfejsu API profilera niskiego poziomu. W tej chwili myślę, że jedyne dostępne opcje to:

oba są komercyjne, nawet jeśli JustMock mają Lite Edition, szydząc non metod wirtualnych są dostępne tylko w reklamie wersja. Jak zauważył w komentarzach jest coś z Microsoft Research, w projekcie Pex and Moles

+5

Myślę, że możesz dodać do tej listy Microsoft Moles/Pex/Fakes. Jako bonus jest darmowy. – podiluska

+0

Podróbki nie są zawarte w edycji ekspresowej VS. –

1

Jak @aqwert i @Felice napisał podczas korzystania Typemock Isolator jest to możliwe (i dość łatwe) mock metod dla wirtualnych bez dodawania lub zmiany kodu na przykład:

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

jak widać utworzony test jest podobny do testu, który próbujesz utworzyć.

Powiązane problemy