2013-06-06 9 views
6

Pracuję nad kodem, który jest wzorowany na enkapsulacji wszystkich argumentów metody jako obiektu "request" i zwracaniu obiektu "response". Jednak spowodowało to pewne problemy, jeśli chodzi o drwi z MOQ. Na przykład:Wartość właściwości stubbowania MOQ na obiekcie "Any"

public class Query : IQuery 
{ 
    public QueryResponse Execute(QueryRequest request) 
    { 
     // get the customer... 
     return new QueryResponse { Customer = customer }; 
    } 
} 

public class QueryRequest 
{ 
    public string Key { get; set; } 
} 

public class QueryResponse 
{ 
    public Customer Customer { get; set; } 
} 

... w moim teście Chcę skrótową zapytanie do zwrotu klientowi, gdy klucz jest podany

var customer = new Customer(); 
var key = "something"; 
var query = new Mock<ICustomerQuery>(); 

// I want to do something like this (but this does not work) 
// i.e. I dont care what the request object that get passed is in but it must have the key value I want to give it 

query.Setup(q => q.Execute(It.IsAny<QueryRequest>().Key = key)).Returns(new QueryResponse {Customer = customer}); 

jest to, co chcemy w MOQ możliwe?

Odpowiedz

11

To, czego szukasz, to metoda It.Is<T>, w której można określić dowolną funkcję Matchera (Func<T, bool>) dla argumentu.

Na przykład sprawdzanie klucza:

query.Setup(q => q.Execute(It.Is<QueryRequest>(q => q.Key == key))) 
    .Returns(new QueryResponse {Customer = customer}); 
+0

Niezła, dzięki! – nashwan

0

Podejrzewam, można to zrobić z niestandardowych dopasowujących.

Od moq's QuickStart page:

// custom matchers 
mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>(); 
... 
public string IsLarge() 
{ 
    return Match.Create<string>(s => !String.IsNullOrEmpty(s) && s.Length > 100); 
} 

Podejrzewam można zrobić coś podobnego. Utwórz metodę, która używa Match.Create<QueryRequest>, aby dopasować swój klucz, np.

public QueryRequest CorrectKey(string key) 
{ 
    return Match.Create<QueryRequest>(qr => qr.Key == key); 
} 

a następnie

_query.Setup(q => q.Execute(CorrectKey(key))).Returns(new QueryResponse {Customer = customer}); 

Uwaga: Nie próbowałem tego kodu, tak mi wybaczyć, jeśli pęknie całkowicie.

Aha, i dla jakiegoś łagodnie powiązanego autopromocja: właśnie ten rodzaj złożoności budzi moje wątpliwości co do Moqa i innych narzędzi szyderczych. Dlatego stworzyłem bibliotekę szyderczą, która pozwala na sprawdzenie argumentów metod za pomocą zwykłego kodu: http://github.com/eteeselink/FakeThat. Jest to w trakcie głównego procesu refaktoryzacji (i zmiany nazwy), więc możesz wstrzymać oddech. Niemniej jednak byłbym zachwycony, słysząc, co o tym myślisz.

EDYCJA: Oh, @ saturesv mnie pokonać, z (prawdopodobnie) lepszą odpowiedzią. Ach tak.

Powiązane problemy