8

メンバーシップ プロバイダーを使用してユーザーの詳細を更新するコントローラー アクションを単体テストしようとしています。今まで使いやすかった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 を捨てる必要がありますか?

4

4 に答える 4

10

Visual Studio 2010 で使用

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

また、モック化されたエンティティ ( serviceMock) がインターフェイスとしてモック化されているか、メソッド名がオーバーライド可能として宣言されていることを確認してください。

于 2011-02-23T22:15:11.800 に答える
6

お気づきのとおり、現在のバージョンのVB.NET(VB9)では、値を返すラムダメソッド(つまり、ラムダ)のみが許可されていますFunctionダミー値を返す関数を作成する以外に、それについてできることはあまりありません。現時点ではテストできないため、この場合の実行可能な回避策かどうかはわかりません。

VB.NETの次のバージョン(VB10)では、言語はラムダをサポートSubし、これらの場合に役立つはずです。

他の人も現在のMoq/VB.NETの組み合わせで程度の違いに問題を抱えているようです。

于 2009-07-21T19:37:11.923 に答える
1

これで契約が成立 したようです。

ちょっとがっかり - 調査にはかなりの時間がかかりました。:/

于 2009-07-21T19:18:23.927 に答える
0

Typemock は、その目的のために VB.NET フレンドリーな API をサポートしています: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

于 2009-12-22T21:46:54.070 に答える