2010-02-02 13 views
12

Czy można zmodyfikować parametr wywołania metody wyszydzanej? W szczególności zamierzam zmienić buffer w poniższym przykładzie na wstępnie wypełnioną tablicę bajtów.Jak zmodyfikować parametr wywołania wyśmiewanej metody za pomocą Moq?

przykład:
int MockedClass.Read(byte[] buffer, int offset, int count)

Objaśnienie:
Wywołanie Read ładunki count bajtów czytaniem offset do dołączonej tablicy bajtów buffer.

Teraz chciałbym, aby bufor był wypełniany po wywołaniu Read w moim kodzie aplikacji. Czy to jest możliwe?

Jeśli tak, w jaki sposób podchodziłbym do kolejnych połączeń z numerem Read? Chciałbym, aby kolejne wywołania zwracały inny bufor za każdym razem, jeśli to możliwe.

EDIT:

używając polecenia Setup takiego:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback((byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

daje mi dziwne problemy podczas wykonywania testów jednostkowych: Gdy wywołanie Read jest wykonany, a kod delegat (buffer[0] = 0xAA) jest wykonywany debugger pokazuje, że buffer jest faktycznie null i wykonanie testu jednostkowego zatrzymuje się po wykonaniu tego polecenia. Czy moja składnia jest zepsuta, czy jest to błąd?

Odpowiedz

14

Możesz użyć metody oddzwaniania. Coś takiego (z pamięci):

var buffer = new byte[64]; 
// ... 
mock.Setup(m => m.Read(buffer, offset, count)) 
    .Callback((buffer, offset, count) => /* fill in buffer here */); 
+0

Cześć Mark. Dziękuję za odpowiedź. Jeśli użyję tego wzorca, mój test jednostki zatrzyma się właśnie w tym punkcie wywołania zwrotnego, gdy delegat zostanie wykonany. Debugowanie problemu wykazało, że tablica bajtów buforów ma wartość 'null'. Jakieś pomysły, dlaczego tak się stało? –

+0

Jest pusta, chyba że ją przypiszesz. Powyższe wywołanie Instalatora nie * przypisuje * zmiennej buforowej - dopasowuje istniejącą zmienną. W swojej edycji pasujesz do 'It.IsAny ()', ale osoba dzwoniąca musi podać tę wartość. –

Powiązane problemy