2011-11-08 10 views
11

Używam MOQ do fałszywe wywołanie metody z oczekiwaną listę zwrotów. Moja metoda zwraca listę, ale chcę, aby próbka tworzyła nową listę za każdym razem, gdy metoda zostanie wywołana. Co zrobiłem do tej pory:Jak wykonać Mock zwrócić nową listę za każdym razem, gdy metoda jest wywoływana za pomocą Moq

List<Correlation> expected = new List<Correlation> { new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }; 
Mock<IRPLValidator> selfMock = new Mock<IRPLValidator>(); 
selfMock.Setup(f => f.Validate()).Returns(expected); 

Co staram się osiągnąć to, aby mock powrót nowa lista każdym razem metoda get wywołana. Próbowałem to, ale nie działa:

selfMock.Setup(f => f.Validate()).Returns(new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }); 

Jak to nie działa, myślę, że może oddzwaniania jest odpowiedź na moje pytanie, ale nie mogę znaleźć żadnego odpowiedniego przykład dla reinicjalizacji moją listę . Jakieś sugestie?

Jak możesz się zastanawiać, dlaczego potrzebuję nowej listy za każdym razem, problem polega na tym, że wywołuję metodę na różnych typach obiektów, wprowadzając pewne zmiany na liście, w zależności od typu obiektu. Ponieważ mock daje mi tę samą listę za każdym razem, gdy wywoływana jest ta metoda, zawsze modyfikuję ten sam obiekt w pamięci, więc nie mogę śledzić zmian, które na nim robię.

Z góry dziękuję!

Odpowiedz

14
selfMock.Setup(f => f.Validate()).Returns(() => new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }); 

Musisz zamienić wartość wewnątrz Returns na funkcję. Wersja, którą wypróbowałeś, stworzyła pojedynczą listę, a następnie zwraca właśnie taką. W ten sposób lista jest tworzona za każdym razem, gdy zwroty wywołają tę funkcję za każdym razem, gdy jest potrzebna.

+0

Pracował jak urok! Wielkie dzięki. To było takie łatwe. –

+0

Dziękuję - pewnego dnia dostanę to całe zamknięcie. – David

+0

Żałuję, że nie znalazłem tego wcześniej, zmarnowałem dzień wczoraj zastanawiając się, dlaczego moja lista nie powróciła zaktualizowana! Dzięki!!! – PmanAce

2

Powroty przyjmują jako parametr wejściowy Funk <> (i różne przeciążenia), dlatego można podać nie tylko niektóre dane w metodzie Powrót, które zostaną zwrócone jako parametry, ale także funkcje, które zostaną wykonane, a wynik funkcja zostanie zwrócona. Rozwiązanie dostarczone przez Rangoric sprawdzi się w twoim przypadku.

+0

Dzięki za wyjaśnienie! –

Powiązane problemy