2009-07-21 4 views
6

Я пытаюсь выполнить тестирование тестового действия контроллера, которое использует поставщик членства для обновления данных пользователя. Я использую Moq, который до сих пор был прост в использовании.Mocking VB.NET Methods With Moq

Проблема в том, что я не могу заставить ее высмеивать вызовы методам, которые ничего не возвращают.

<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 

Установка на издевались служба членства не будет компилировать, ошибка:

разрешение перегрузки не удалось, поскольку не доступна «Настройки» можно назвать с этих аргументы:

'Публичная функция Настройка (из TResult) (выражение As System.Linq.Expressions.Expression (Of System.Func (Of Services.IMembershipServic e, TResult))) Как Moq.Language.Flow.ISetup (Of Services.IMembershipService, TResult) ': Выражение не производит значение.

«Setup Public Function (Of TResult) (выражение Как System.Linq.Expressions.Expression (Of System.Func (Из Services.IMembershipService, TResult))) Как Moq.Language.Flow. ISetup (Of Services.IMembershipService, TResult) ': Тип данных (ы) типа параметр (ы) не может быть выведен из этих аргументов. Указание данных тип (и) явно может исправить ошибку .

«Public Function Setup (выражение Как System.Linq.Expressions.Expression (Of System.Action (Of Services.IMembershipService))) Как Moq.Language.Flow.ISetup (Of Services.IMembershipService) ': Выражение не дает значения.

Что я пропустил? Должен ли я создавать фальшивый класс, а не использовать Moq в любое время, когда у моего класса есть метод, который я хочу вызвать?

Edit:

Хорошо, немного чтение вокруг предполагает, что это связано с тем, как лямбды выражаются в VB с помощью функции(), который должен иметь результат.

Неужели кто-нибудь нашел работу для этого или мне придется вырезать Moq для поддельных методов?

ответ

6

Как вы уже нашли, текущая версия VB.NET (VB9) позволяет только лямбда-методы возвращать значение (то есть Function lambdas). На самом деле вы ничего не можете сделать, кроме create a function to return a dummy value. Я не могу проверить это на данный момент, поэтому я не уверен, что это жизнеспособное решение для этого случая.

В next version of VB.NET (VB10) язык поддерживает Sub lambdas и должен помочь в этих случаях.

Кажется, что другие люди также являются having trouble различной степени с текущей комбинацией Moq/VB.NET.

+0

:(Позор действительно, кроме этого, я действительно люблю Moq. Если я предлагаю боссу, мы отложим разработку на следующий год, чтобы они могли получить VB10, я думаю, он убьет меня! – Nick

1

Кажется, что this печатает сделку.

Доброе разочарование - расследование заняло у меня довольно много времени. :/

0

Typemock поддерживает VB.NET дружной API для этой цели: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

+3

К сожалению, небольшую группу внутренних разработчиков мы не можем оправдать стоимость TypeMock. В настоящее время мы просто пишем методы, которые нам нужно высмеивать как функции, возвращающие логическое и ожидающие VB10. – Nick

7

В Visual Studio 2010 используйте

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

Кроме того, убедитесь, что издевались сущность (serviceMock) либо высмеивались как интерфейс, или имеет имя MethodName как переопределяемое.