2012-06-13 9 views
10

chcę drwić tylko metodę następnej klasy GetValue korzystając Min:Częściowa szyderczy klasy z Min

public class MyClass 
{ 
    public virtual void MyMethod() 
    { 
     int value = GetValue(); 
     Console.WriteLine("ORIGINAL MyMethod: " + value); 
    } 

    internal virtual int GetValue() 
    { 
     Console.WriteLine("ORIGINAL GetValue"); 
     return 10; 
    } 
} 

już czytać trochę jak to powinno działać z Min. Rozwiązaniem, które znalazłem online, jest użycie właściwości CallBase, ale to nie działa dla mnie.

To moja próba:

[Test] 
public void TestMyClass() 
{ 
    var my = new Mock<MyClass> { CallBase = true }; 
    my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999); 
    my.Object.MyMethod(); 
    my.VerifyAll(); 
} 

Spodziewam się, że Moq wykorzystuje istniejące wdrożenia MyMethod i wywołuje szydzili metodę, w wyniku następujące dane wyjściowe:

ORIGINAL MyMethod: 999 
MOCKED GetValue 

ale to co ja Uzyskaj:

ORIGINAL GetValue 
ORIGINAL MyMethod: 10 

, a następnie

Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue() 

Mam wrażenie, że zupełnie coś źle zrozumiałem. Czego tu mi brakuje? Każda pomoc będzie mile widziane

+0

możliwe duplikat [Kiedy szydząc klasę z Min, jak mogę CallBase dla właśnie specyficzny metody?] (http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase- for-just-specific-metods) – StriplingWarrior

+0

Jeśli zrobisz swoje ' GetValue' metoda 'public' zamiast' internal' działa. Nie wiem, dlaczego to może być ograniczenie dynamicznego proxy proxy, czy jest to błąd Moq, czy to jest zamierzone zachowanie. W każdym razie, jeśli zostawisz to jako wewnętrzne, nie możesz umieścić swojego kodu produkcyjnego w innym zestawie, chyba że użyjesz InternalVisibleTo. – nemesv

+0

możliwy duplikat [Weryfikacja metody została wywołana] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-called) – nemesv

Odpowiedz

5

OK, znalazłem odpowiedź na to pytanie w innym: How to Mock the Internal Method of a class?. Jest to więc duplikat i można go zamknąć.

Niemniej jednak, oto rozwiązanie: wystarczy dodać tę linię do Assembly.config projektu chcesz testu:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq 
+0

Do testu Assembly.config testu? Albo do klasy Assembly.config testowanej klasy? – Nick

+0

Z klasy, która jest testowana! Poprawiłem moją odpowiedź i wyjaśniłem to. – Fabian

0

Czy spróbować określić zweryfikowania:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable(); 
+0

nie próbował, ale to nie ma znaczenia – Fabian