2011-10-25 20 views
1

私がmoqの概念を理解するのを助けることができるかどうか疑問に思っていました...私はテストしたいメソッドがあります。それは私が模擬したいデータアクセスメソッドを含んでいます。moqを使ったvb.netの模擬メソッド

テストの方法:

Public Function GetReport(ByVal district As String, ByVal hub As String, ByVal dateFrom As Date, ByVal dateTo As Date, ByVal response As HttpResponse) As String 
     Dim msg As String = String.Empty 
     Dim rs As New ReportingService 

     _dt = _dal.GetData(district, hub, dateFrom, dateTo) 

     If _dt.Rows.Count <= 0 Then 
      msg = "There were no records found for the selected criteria." 
     ElseIf _dt.Rows.Count + 1 > 65536 Then 
      msg = "Too many rows - Export to Excel not possible." 
     Else 
      rs.Export(_dt, "AcceptanceOfOffer", response) 
     End If 

     Return msg 
    End Function 

私は制御ロジックをテストしたいです。データテーブルに0,1または複数の行がある場合は、別のメッセージを返す必要があります。_dal.GetDataの結果は気にしませんが、これは私が模擬したいメソッドです。

'''<summary> 
'''A test for GetReport 
'''</summary> 
<TestMethod()> _ 
Public Sub GetReportTest() 
    'Create a fake object 
    Dim mock = New Mock(Of IAcceptanceOfferDAL) 
    'Create the real data to be returned by the fake 
    Dim returnDt As DataTable = New DataTable() 
    returnDt.Columns.Add("District", Type.GetType("System.String")) 
    returnDt.Columns.Add("Hub", Type.GetType("System.String")) 
    returnDt.Columns.Add("dateFrom", Type.GetType("System.DateTime")) 
    returnDt.Columns.Add("dateTo", Type.GetType("System.DateTime")) 
    returnDt.Rows.Add("District", "Hub", Date.Today, Date.Today) 

    'Setup the fake so that when the method is called the data created above will be returned 
    mock.Setup(Function(f) f.GetData(It.IsAny(Of String), It.IsAny(Of String), It.IsAny(Of Date), It.IsAny(Of Date))).Returns(returnDt) 

    'Call the real method with the expectation that when it calls GetData it will use our mock object 
    Dim target = New AcceptanceOfferBLL 

    Dim response As HttpResponse 
    Dim actual = target.GetReport("district", "hub", Date.Today, Date.Today, response) 
    'Because our mock returns 1 row it will skip over our if statements and should return string.empty 
    Assert.AreEqual("", actual) 

End Sub 

それは、私はモックしようとしていますDALクラスとメソッドの関連です念のために:ここ

は私のテスト、そのような無NUnitのか何かです。

Public Interface IAcceptanceOfferDAL 
    Function GetData(ByVal district As String, ByVal site As String, ByVal dateFrom As Date, ByVal dateTo As Date) As DataTable 
End Interface 

Public Class AcceptanceOfferDAL : Implements IAcceptanceOfferDAL 
    Private _ds As New DataService.DataAccess 
    Private _sNameSP As String = "" 
    Private _listSQLParams As New List(Of SqlParameter) 

    Public Function GetData(ByVal district As String, ByVal site As String, ByVal dateFrom As Date, ByVal dateTo As Date) As DataTable Implements IAcceptanceOfferDAL.GetData 
     _sNameSP = "up_AcceptanceHub_get" 

     Dim sqlParam As SqlParameter = New SqlParameter("@district", district) 
     Dim sqlParam1 As SqlParameter = New SqlParameter("@hub", site) 
     Dim sqlParam2 As SqlParameter = New SqlParameter("@DateFrom", dateFrom) 
     Dim sqlParam3 As SqlParameter = New SqlParameter("@DateTo", dateTo) 

     _listSQLParams.Add(sqlParam) 
     _listSQLParams.Add(sqlParam1) 
     _listSQLParams.Add(sqlParam2) 
     _listSQLParams.Add(sqlParam3) 

     Return (_ds.LoadDataTableByID(_listSQLParams, _sNameSP)) 

    End Function 

End Class 

明らかにこれは、私は成功せずMOQクイックスタートや他のplacesをチェックしました、動作しません。これも可能ですか、または.verifyなどを使用する必要がありますか? This postは、私が使用しようとしている構造を持っています。その場合は、模擬オブジェクトがメソッドの引数として渡されます。

+0

"これはうまくいかない"とはどういう意味ですか? – PatrickSteele

+0

コードは、メソッドのプロキシバージョンではなく、実際の具体的なdal.GetDataメソッドに移動します。それは、テストに作成したダミーのデータセットではなく、データベースに接続して情報を返します。 – Andrew

+0

モックIAcceptanceOfferDALをAcceptanceOfferBLLに渡すことは決してありません。 AcceptanceOfferBLLの "_dal"変数はどのように作成されますか?これは実行時にIOCコンテナを介して注入されるコンストラクタの依存関係である必要がありますが、テスト中は嘲笑されます。 – PatrickSteele

答えて

0

GetReportの方法は、メソッドの外で定義された_dalに依存します。 GetReportのみが他の場所でインスタンス化された_dalオブジェクトを使用することを知っているので、このように

IAcceptanceOfferDALのためのモックオブジェクトを作成するにもかかわらず、そのモックオブジェクトが遊びに来ていません。

この依存関係を回避するには、_dalオブジェクトをパラメータとしてメソッドに渡す必要があります。

Public Function GetReport(ByVal district As String 
         , ByVal hub As String 
         , ByVal dateFrom As Date 
         , ByVal dateTo As Date 
         , ByVal response As HttpResponse 
         , ByVal _dal As IAcceptanceOfferDAL) As String 

そうのようなGetReport方法テストするときにこれを行うことにより、IAcceptanceOfferDALのモックとそのGetData機能の設定は、劇中で次のようになります。GetReportを変え、

Dim actual = target.GetReport("district" 
          , "hub" 
          , Date.Today 
          , Date.Today 
          , response 
          , mock) 

だから、明確にするためにメソッドではIAcceptanceOfferDALのインスタンスをパラメータとして受け入れることで、テスト時にモックオブジェクトをこのメソッドに渡すことができ、そのモックを渡す機能はもちろん、GetDataメソッドの戻り値に対して望ましいコントロールを提供します。

希望します。

+0

それは確かにテストのために働くでしょうが、ちょうど私がそれをテストすることができるようにこのやり方でコードを変更する必要が少しあるようです...私は間違っていませんか? – Andrew

+0

私はこれを考え方の変化とみなしています。メソッドに依存するオブジェクトやサービスは、インタフェースによって参照されるべきであり、そのインタフェースをメソッドのパラメータとして渡す必要があります。これにより、単体テストでオブジェクトやサービスのモックを渡すことができますが、アプリケーション内のメソッドへの呼び出しは、同じインタフェースを実装するオブジェクトやサービスのインスタンスを渡し、単体テストが避けなければならない依存関係を完了させます。 – jimmym715

関連する問題