2012-10-19 12 views
6

Mam następujący interfejs:FakeItEasy - Czy można przechwycić metodę i zastąpić ją moją własną implementacją?

public interface IOuputDestination 
{ 
    void Write(String s); 
} 

W moim badanej jednostki, ja drwić go tak:

var outputDestination = A.Fake<IOutputDestination>(); 

Co chcę zrobić, to przechwytujący metody zapisu tak, że używa mój zwyczaj implementacja, którą definiuję w moim teście. Coś takiego:

String output = ""; 
A.CallTo(() => outputDestination.Write(A<String>.Ignored)).Action(s => output += s); 
       //Is something like this even possible ? ----^ 

Tutaj nie istnieje metoda Action, ale to, co chciałbym się zdarzyć, że każdy parametr przekazany do outputDestination.Write zostać przekierowany do mojej akcji niestandardowej. Czy jest to możliwe przy użyciu FakeItEasy? Jeśli nie, czy istnieje inna szydercza struktura, która pozwala na takie zachowanie?

Odpowiedz

7

można uzyskać to zachowanie z Invokes:

String output = ""; 
A.CallTo(() => outputDestination.Write(A<String>.Ignored)) 
    .Invokes((string s) => output += s); 
0

naprawdę nie pokazać, jak używasz outputDestination po utworzeniu go. Czy wstrzyknąłbyś ją do jakiejś testowanej metody? Jeśli tak, to Co, jeśli zamiast tworzyć fałszywe, utworzysz specjalnie spreparowaną klasę, która implementuje IOutputDestination i która zawiera wymaganą implementację Write()?

Sądzę, że to zależy od tego, o ile (jeśli w ogóle) są inne bahaviours, które musisz zweryfikować na swoim podróbku. Trudno go poznać bez większego kontekstu.