vb.net издевается над методами дал с moq - PullRequest
1 голос
/ 26 октября 2011

Мне было интересно, можете ли вы помочь мне понять концепцию moq ... У меня есть метод, который я хочу проверить. Он содержит метод доступа к данным, который я хочу издеваться.

Метод проверки:

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 

Я хочу проверить логику управления. Если в datatable есть 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, которые я пытаюсь смоделировать.

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 и другие места безуспешно. Это вообще возможно, или я должен использовать .verify или что-то еще? Этот пост имеет структуру, которую я хочу использовать, за исключением того случая, когда макет объекта передается в качестве аргумента методу.

1 Ответ

0 голосов
/ 26 октября 2011

Метод GetReport зависит от _dal, который определен вне метода GetReport.

Таким образом, несмотря на создание фиктивного объекта для IAcceptanceOfferDAL, этот фиктивный объект не вступает в игру, потому что GetReport знает только об использовании объекта _dal, который был создан в другом месте.

Чтобы обойти эту зависимость, объект _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

При этом макет IAcceptanceOfferDAL и настройка его функции GetData будут задействованы при тестировании метода GetReport следующим образом:

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

Итак, чтобы быть ясным, изменение метода GetReport таким образом, чтобы он принимал экземпляр IAcceptanceOfferDAL в качестве параметра, позволяет фиктивному объекту передаваться в этот метод при тестировании и способности передавать этот макет, конечно, обеспечивает желаемый контроль над возвращаемым значением метода GetData.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...