2009-07-15 6 views
0

私はASP.NET MVCに取り掛かりつつありますし、単体テストも初めてです。複雑なviewModelsを使用したユニットテストコントローラの動作

私は、ビューモデルを使用してインデックスビューを設定するコントローラーアクションを持っています。コントローラのコンストラクタで偽のサービスクラスを渡すことができるのでコントローラの動作をテストするのは簡単ですが、私のviewmodelは非常に複雑で、インスタンス化時には独自のサービスクラスを取得します。

コードが...私は願っています。この明確にすべきである

コントローラのアクション:

Function Index(ByVal id As Integer?) As ActionResult 
    Dim totalCount As Integer = 0 
    Dim selectedClient As Integer 
    If id Is Nothing Then 
    selectedClient = _portalClientService.GetFirstClient().ID 
    Else 
    selectedClient = id 
    End If 
    Dim users As MembershipUserCollection = _membershipService.GetUsersByClientId(selectedClient, 0, 1000, totalCount) 
    Return View(New UserListViewModel(users, selectedClient)) 
End Function 

のViewModelクラス:

Public Class UserListViewModel 

    Private _clientService As IPortalClientService 

    Public Sub New(ByVal users As MembershipUserCollection, ByVal selectedClient As Integer) 
    Me.New(users, selectedClient, Nothing) 
    End Sub 

    Public Sub New(ByVal users As MembershipUserCollection, ByVal selectedClient As Integer, ByVal clientService As IPortalClientService) 
    _users = users 
    _clientService = If(clientService, New PortalClientService) 
    _clients = New SelectList(_clientService.GetClients.OrderBy(Function(c) c.ClientName), "ID", "ClientName", selectedClient) 
    End Sub 

    Private _users As MembershipUserCollection 
    Public Property Users() As MembershipUserCollection 
    Get 
     Return _users 
    End Get 
    Set(ByVal value As MembershipUserCollection) 
     _users = value 
    End Set 
    End Property 

    Private _clients As SelectList 
    Public Property Clients() As SelectList 
    Get 
     Return _clients 
    End Get 
    Set(ByVal value As SelectList) 
     _clients = value 
    End Set 
    End Property 

End Class 

EDIT:

コントローラのアクションをテストし、ビューモデルに偽のサービスクラスを使用させるにはどうすればよいですか?

最初のコンストラクタを破棄して、常にコントローラからサービスを渡すか、別の方法がありますか?

乾杯、
ニック

答えて

0

は実は、これは我々の公共直面したAPIの中にすべての時間を使用するパターンであり、依存性注入の良い使用方法を示します。私は問題のないコードレビューでこれを渡します。

この実装では、オブジェクトを柔軟に作成するオプションが提供され、テスト容易性が提供されます。

唯一の「問題」は、テストでは最初のコンストラクタの1行のコードを簡単にカバーできないということですが、コードカバレッジについて熱狂的な人がいれば問題になります。 。

+0

おかげで、私が外にすぎないんだけど知って良いことだ:) 主な問題は、ユニットテストでは、私はコントローラに偽のclientserviceクラスを渡すことができるということですが、のviewmodelは、それが独自のサービスクラスとヒットだインスタンス化データベース。 コントローラアクションを変更しないで、コントローラアクションをテストするときに偽のサービスクラスを使用するようにviewmodelを取得する方法はありますか? – Nick

3

私はおそらく髪を分割していますが、あなたのモデルはビューモデルよりもドメインモデルだと言います。 IPortalClientServiceへの依存関係を削除するか、少なくともモデル自体をインスタンス化することはできません。

このような依存関係をビューから離れて削除することをお勧めします。

関連する問題