2009-07-21 18 views
6

Próbuję przetestować działanie kontrolera, które korzysta z dostawcy członkostwa, aby zaktualizować dane użytkownika. Używam Moq, który do tej pory był łatwy w użyciu.Prześmiewanie metod VB.NET za pomocą Moq

Problem polega na tym, że nie mogę sprawić, by kpił z wywołań metod, które niczego nie zwracają.

<TestMethod()> _ 
Public Sub Can_Update_User() 
    ' Arrange 
    _membershipService.Setup(Function(x) x.UpdateUser(It.IsAny(Of MembershipUser))) 
    Dim controller As New UsersController(_membershipService.Object, _roleProvider.Object, _supportWorksService.Object, _portalClientService.Object) 
    ' Act 
    Dim result As ViewResult = controller.Edit("testUser", New FormCollection) 
    ' Assert 
    Assert.AreEqual("Index", result.ViewName) 
End Sub 

Konfiguracja z wyśmiewali usługi członkostwa nie zostanie skompilowany, błąd jest:

rozdzielczości przeciążenia powiodło się, ponieważ nie dostępny „Ustawienia” można nazwać z te argumenty:

"Funkcja publiczna Konfiguracja (z TResult) (wyrażenie jako System.Linq.Expressions.Expression (of System.Func (of Services.IMembershipServic e, TResult))) As Moq.Language.Flow.ISetup (Z Services.IMembershipService, TResult) ": Wyrażenie nie generuje wartości .

„Public Function Setup (Of TResult) (wyrażenie Jak System.Linq.Expressions.Expression (z System.Func (z Services.IMembershipService, TResult))) jako Moq.Language.Flow. ISetup (of Services.IMembershipService, TResult) ': Typy danych parametru (typów) typu nie mogą być wywnioskowane z tych argumentów. Określenie typów danych jawnie może poprawić ten błąd .

„Public Function Setup (ekspresja Jako System.Linq.Expressions.Expression (z System.Action (z Services.IMembershipService))) jako Moq.Language.Flow.ISetup (z Services.IMembershipService) ": Wyrażenie nie generuje wartości.

Co przeoczyłem? Czy będę musiał stworzyć fałszywą klasę zamiast używać Moqa, kiedy moja klasa ma metodę, którą chcę wywołać?

Edit:

Ok, trochę czytanie wokół sugeruje to ze względu na sposób lambdas są wyrażone w VB przy użyciu funkcji(), która musi mieć wynik.

Czy ktoś znalazł w tym celu jakieś zadanie, czy też będę musiał zrezygnować z Moqa w celu udawania metod?

Odpowiedz

6

Jak już ustalono, bieżąca wersja VB.NET (VB9) zezwala tylko na metody lambda, które zwracają wartość (np. Function lambdas). Naprawdę niewiele można z tym zrobić poza create a function to return a dummy value. Nie mogę go przetestować w tej chwili, więc nie jestem pewien, czy jest to wykonalne obejście tego przypadku.

W języku next version of VB.NET (VB10) język będzie obsługiwać Sub lambdas i powinien pomóc w takich przypadkach.

Wygląda na to, że inni ludzie również są having trouble w różnym stopniu z obecną kombinacją Moq/VB.NET.

+0

:(Wstyd naprawdę, poza tym naprawdę kocham Moqa.Jeśli proponuję szefowi, odkładamy prace na kolejny rok, aby mogli uzyskać VB10, myślę, że on mnie zabije! – Nick

1

Wygląda na to, że this zamyka transakcję.

Zawiedliśmy się - śledztwo zajęło mi sporo czasu. :/

7

w Visual Studio 2010 użytkowania

serviceMock.Setup(Sub(c) c.MethodName(paramName)) 

Ponadto, upewnij się, że wyśmiewali podmiot (serviceMock) jest albo wyśmiewany jako interfejs lub nazwa metody została zadeklarowana jako nadpisywalna.

Powiązane problemy