【问题标题】:Moq method with list parameter带列表参数的起订量方法
【发布时间】:2013-12-28 00:39:58
【问题描述】:

您好,我有以下测试

    <TestInitialize()>
Public Sub Initialise()
    dbHelper = New Mock(Of IDbHelper)
    dt = New DataTable()
    dt.Columns.AddRange(New DataColumn() {New DataColumn("AreaId"),
                                          New DataColumn("Area"),
                                          New DataColumn("CountryId"),
                                          New DataColumn("Country"),
                                          New DataColumn("SubRegionId"),
                                          New DataColumn("SubRegion"),
                                          New DataColumn("RegionId"),
                                          New DataColumn("Region"),
                                          New DataColumn("Notes"),
                                          New DataColumn("Enabled"),
                                          New DataColumn("FlagIgnoreFactsheet")
                                          })
    dt.Rows.Add(New String() {"0", "", "0", "", "0", "", "0", "", "", "True", "False"})

    Dim paramList As New List(Of SqlParameter)
    paramList.Add(New SqlParameter("@AreaId", It.IsAny(Of Int64)))
    paramList.Add(New SqlParameter("@AreaName", String.Empty))
    paramList.Add(New SqlParameter("@CountryId", 0))
    paramList.Add(New SqlParameter("@Enabled", 1))
    paramList.Add(New SqlParameter("@ShowAll", 0))

    dbHelper.Setup(Function(db) db.ExecuteReader(It.IsAny(Of String), paramList)).Returns(dt)

End Sub

 <TestMethod()>
Public Sub GetAreaWithParamTest()

    Dim areaRepository As AreaRepository = New AreaRepository(dbHelper.Object)

    Dim result = areaRepository.GetArea(1)

    Assert.IsNotNull(result)
End Sub

但测试失败,因为 dbHelper.ExecuteReader 返回一个空对象而不是预期的 Datatable。

但是,如果我使用 It.IsAny(Of List(Of SqlParameter)) 而不是发送参数,它会起作用

这是GetArea方法的代码

Public Function GetArea(ByVal pAreaId As Long) As AreaEntity Implements IAreaRepository.GetArea
        MyResponse = Nothing
        If pAreaId = 0 Then Return Nothing

        Try
            Dim paramList As New List(Of SqlParameter)
            paramList.Add(New SqlParameter("@AreaId", pAreaId))
            paramList.Add(New SqlParameter("@AreaName", String.Empty))
            paramList.Add(New SqlParameter("@CountryId", 0))
            paramList.Add(New SqlParameter("@Enabled", 1))
            paramList.Add(New SqlParameter("@ShowAll", 0))

            Dim dt As DataTable = _dbHelper.ExecuteReader("sp_Core_AreaList", paramList)
            MyResponse = _dbHelper.MyResponse

            If IsNothing(dt) OrElse dt.Rows.Count = 0 Then Return Nothing

            Dim dr As DataRow = dt.Rows.Cast(Of DataRow).First()

            Dim result As AreaEntity = New AreaEntity() With {
                .AreaId = IIf(IsDBNull(dr("AreaId")), 0, dr("AreaId")),
                .AreaName = IIf(IsDBNull(dr("Area")), String.Empty, dr("Area")),
                .CountryId = IIf(IsDBNull(dr("CountryId")), 0, dr("CountryId")),
                .CountryName = IIf(IsDBNull(dr("Country")), String.Empty, dr("Country")),
                .SubRegionId = IIf(IsDBNull(dr("SubRegionId")), 0, dr("SubRegionId")),
                .SubRegionName = IIf(IsDBNull(dr("SubRegion")), String.Empty, dr("SubRegion")),
                .RegionId = IIf(IsDBNull(dr("RegionId")), 0, dr("RegionId")),
                .RegionName = IIf(IsDBNull(dr("Region")), String.Empty, dr("Region")),
                .Notes = IIf(IsDBNull(dr("Notes")), String.Empty, dr("Notes")),
                .Enabled = IIf(IsDBNull(dr("Enabled")), False, dr("Enabled")),
                .FlagIgnoreFactsheet = IIf(IsDBNull(dr("FlagIgnoreFactsheet")), False, dr("FlagIgnoreFactsheet"))
            }

            Return result
        Catch ex As Exception
            MyResponse = New Response("AreaRepository.GetArea", "Error while loading area information", ex)
            Return Nothing
        End Try

    End Function

请帮忙!!!!!!

【问题讨论】:

    标签: testing tdd moq


    【解决方案1】:

    当您使用dbHelper.Setup(Function(db) db.ExecuteReader(It.IsAny(Of String), paramList)).Returns(dt) 设置ExecuteReader() 方法时,它期望paramList 将作为参数传递。但实际上你传递了另一个具有相同结构的对象。

    MOQ 通过引用比较 Lists。 您也可以使用 Expressions 来面对同样的问题。我已经回答了问题Why this mock with Expression is not matching?

    我建议您使用It.IsAny(Of List(Of SqlParameter)) 设置ExecuteReader() 方法,然后使用 Callbacks 验证参数列表

    在 GitHub 上使用 Callbacks 的示例:

    mock.Setup(foo => foo.Execute(It.IsAny<int>(), It.IsAny<string>()))
        .Returns(true)
        .Callback<int, string>((i, s) => 
            {
                /* your asserts can be placed here */
            });
    

    【讨论】:

    • 非常感谢。我是一个完整的起订量初学者,你能推荐任何可以让我加快速度的教程/书吗?
    • 我觉得Quickstart第一次就够了。它涵盖了许多用例。
    猜你喜欢
    • 2016-12-11
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2014-03-25
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多