2009-07-21 10 views
6

メンバーのプロバイダを使用してユーザーの詳細を更新するコントローラーアクションを単体テストしようとしています。これまで使用し易いMoqを使用しています。Moqを使用してVB.NETメソッドをモック

問題は、何も返さないメソッドへの呼び出しを模擬するようには思えないということです。

<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 

嘲笑メンバーシップサービスのセットアップがコンパイルされません、エラーは次のとおりです。

:なし アクセス「セットアップ」がこれらの引数 と呼ばれることができませんので

オーバーロードの解決に失敗しました

'パブリック関数 セットアップ(Of TResult)(式は )System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipServic ( Services.IMembershipService、 TResult) ':式は 値を生成しません。 Moq.Language.Flowとして

( TResultの)「公共の機能設定(() Services.IMembershipService、 TResultの System.Func()の System.Linq.Expressions.Expressionとして表現)。 ISetup( Services.IMembershipService、 TResult) ': 型のデータ型は、これらの引数の から推測できません。データ のタイプを明示的に指定すると、この エラーを修正する可能性があります。 Services.IMembershipServiceの Moq.Language.Flow.ISetup(として

「公開機能 セットアップ( Services.IMembershipServiceの System.Action()の System.Linq.Expressions.Expression()として表現) ) ': 式は値を生成しません。

何が欠けていますか?私のクラスには、呼びたいメソッドがあるときはいつでもMoqを使用するよりも、偽のクラスを作成する必要がありますか?

編集:

[OK]を、周りの少し読みが、これはラムダが結果を持っている必要があります関数を()を使用して、VBで表現されている方法が原因であることを示唆しています。

誰かがこの問題を回避する方法を見つけたのですか、あるいは私は方法を偽造するためにMoqを捨てなければなりませんか?

答えて

6

VB.NET(VB9)の現在のバージョンでは、値を返すラムダメソッド(つまり、Functionのlambdas)しか使用できません。 create a function to return a dummy value以外のことはできません。私は現時点でそれをテストすることはできませんので、このケースの実行可能な回避策であるかどうかはわかりません。

next version of VB.NET(VB10)では、言語がSubのラムダをサポートしているため、このような場合に役立ちます。

現在のMoq/VB.NETの組み合わせとは程度の異なるhaving troubleと思われます。

+0

私は上司に提案すれば、VB10を出すことができるように開発を延期しているので、彼は私を殺すでしょう! – Nick

1

thisとの取引が封印されているようです。

いいえ、私はかなりの時間がかかりました。 :/

0

Typemockは、その目的のためのVB.NET優しいAPIをサポートしています。Visual Studio 2010の使用では http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

+3

残念なことに小さなグループの内部開発者は、TypeMockのコストを正当化することはできません。現在、ブール値を返し、VB10を待っている関数として模倣する必要があるメソッドを記述しています。 – Nick

7

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

また、嘲笑エンティティ(serviceMockは)どちらかと嘲笑されていることを確認してくださいインターフェイスを使用しているか、またはオーバーライド可能と宣言されたMethodNameを持っています。

関連する問題