如何将现有代码分为演示者和模型以实现MVP和单元测试

问题描述 投票:0回答:1

我正在尝试重构现有的WinForms应用程序以首次使用Model-View-Presenter(MVP)模式,以便随后编写单元测试。我有很多像下面这样的现有代码,它没有UI / View的问题,但是我需要为此验证功能编写单元测试,而实际上不会引起数据库调用。我应该如何将其分为Model vs Presenter类?我不确定如何从中提取模型类:

Friend Sub ValidateAmountNotEntered(exp() As String, paramString As String, exp2() As String, paramString2 As String)
    Dim SqlStmt As String = "[Long complex parameterized query to 
        Select values From 4 tables (T1 T2 T3 T4) 
        Where T1.Column1 = ?
        And T2.Column1 In (" & paramString & ")  
        And T4.Column1 In (" & paramString2 & ")  ]"

    Dim com As New OdbcCommand With {
        .Connection = New OdbcConnection(CommonUtilities.GetODBCConnectionString()),
        .CommandText = SqlStmt
    }

    com.Parameters.AddWithValue("?", CStr(GlngNum))
    For Each parameter As String In exp2
        com.Parameters.AddWithValue("?", parameter.Replace("'", String.Empty))
    Next
    For Each parameter As String In exp
        com.Parameters.AddWithValue("?", parameter.Replace("'", String.Empty))
    Next

    Dim adap As OdbcDataAdapter = New OdbcDataAdapter(com)
    Dim rsRates As New DataSet("dsl")
    adap.Fill(rsRates)
    For Each iteration_row As DataRow In rsRates.Tables(0).Rows
        AddErrorItem(iteration_row.Item("T1.Column1"), "R", "Amount for " & iteration_row.Item("T4.Column1").Trim() & "; " & iteration_row.Item("T3.Column1").Trim() & " not entered")
    Next iteration_row
End Sub

任何人都可以指导或提供示例吗?

vb.net unit-testing refactoring mvp legacy-code
1个回答
0
投票

您可以提取一个专用的数据访问层,该层执行与数据库的所有交互。然后,您可以在更高层的任何测试中模拟该DAL。例如,如果您具有一个DataAccess类,该类具有一个GetData方法,该方法返回从数据库填充的DataTable,则对业务逻辑的测试可以模拟该类的该方法并返回一个固定的DataTable,因此不需要数据库访问。

模型就是数据本身。如果您使用的是标准ADO.NET,则不需要专用模型,因为您已经在使用DataTables,可能还使用了DataSets。您可以选择创建自己的专用模型类,然后在它们与DataTables之间进行映射。

然后,演示者是数据访问层和演示层之间的代理。它只是在视图和数据访问层之间移动数据。

© www.soinside.com 2019 - 2024. All rights reserved.