Пересмешивание методов VB.NET с помощью Moq - PullRequest
6 голосов
/ 21 июля 2009

Я пытаюсь выполнить модульное тестирование действия контроллера, использующего поставщика членства для обновления сведений о пользователе. Я использую 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

Настройка службы проверки на членство не компилируется, ошибка:

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

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

'Настройка публичных функций (из TResult) (выражение As System.Linq.Expressions.Expression (Из System.Func (Из Services.IMembershipService, TResult))) как Moq.Language.Flow.ISetup (Из Services.IMembershipService, TResult) ': Тип (ы) данных типа параметр (ы) не может быть выведен из эти аргументы. Указание данных Тип (ы) явно может исправить это ошибка.

'Публичная функция Настройка (выражение As System.Linq.Expressions.Expression (Из System.Action (Из Services.ImmbershipService))) As Moq.Language.Flow.ISetup (Из Services.IMembershipService) ': Выражение не дает значения.

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

Edit:

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

Кто-нибудь нашел способ обойти это или мне придется отказаться от Moq для подделки?

Ответы [ 4 ]

8 голосов
/ 24 февраля 2011

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

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

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

6 голосов
/ 21 июля 2009

Как вы обнаружили, текущая версия VB.NET (VB9) допускает только лямбда-методы, которые возвращают значение (т. Е. Function лямбда-выражения). На самом деле с этим ничего не поделаешь, кроме создания функции, возвращающей фиктивное значение . Я не могу проверить это в настоящее время, поэтому я не уверен, что это приемлемый обходной путь для этого случая.

В следующей версии VB.NET (VB10) язык будет поддерживать Sub лямбды и должен помогать в этих случаях.

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

1 голос
/ 21 июля 2009

Кажется, что это заключает сделку.

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

0 голосов
/ 23 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...