メンバーシップ プロバイダーを使用してユーザーの詳細を更新するコントローラー アクションを単体テストしようとしています。今まで使いやすかった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
モック メンバーシップ サービスのセットアップがコンパイルされません。エラーは次のとおりです。
これらの引数を使用してアクセス可能な「セットアップ」を呼び出すことができないため、オーバーロードの解決に失敗しました:
'Public Function Setup(Of TResult)(Expression As System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService, TResult))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService, TResult)' : 式は値を生成しません。
'Public Function Setup(Of TResult)(Expression As System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService, TResult))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService, TResult)' : 型パラメーターのデータ型は、これらの引数から推測できません。データ型を明示的に指定すると、このエラーが修正される場合があります。
'Public Function Setup(expression As System.Linq.Expressions.Expression(Of System.Action(Of Services.IMembershipService))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService)': 式は値を生成しません。
私は何を逃したのですか?クラスに呼び出したいメソッドがある場合はいつでも、Moq を使用するのではなく、偽のクラスを作成する必要がありますか?
編集:
OK、少し読んでみると、VB で Function() を使用してラムダを表現する方法が原因であることがわかります。これには結果が必要です。
誰かがこれに対する回避策を見つけましたか、それともメソッドを偽造するために Moq を捨てる必要がありますか?