私が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は、私が使用しようとしている構造を持っています。その場合は、模擬オブジェクトがメソッドの引数として渡されます。
"これはうまくいかない"とはどういう意味ですか? – PatrickSteele
コードは、メソッドのプロキシバージョンではなく、実際の具体的なdal.GetDataメソッドに移動します。それは、テストに作成したダミーのデータセットではなく、データベースに接続して情報を返します。 – Andrew
モックIAcceptanceOfferDALをAcceptanceOfferBLLに渡すことは決してありません。 AcceptanceOfferBLLの "_dal"変数はどのように作成されますか?これは実行時にIOCコンテナを介して注入されるコンストラクタの依存関係である必要がありますが、テスト中は嘲笑されます。 – PatrickSteele