Как разделить существующий код на презентацию и модель для реализации MVP и модульного тестирования - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь реорганизовать существующее приложение 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

Может кто-нибудь помочь или привести пример?

1 Ответ

1 голос
/ 22 марта 2020

Вы можете извлечь выделенный слой доступа к данным, который выполняет все взаимодействия с базой данных. Затем вы можете посмеяться над этим DAL в любых тестах верхних уровней. Например, если у вас есть класс DataAccess, который имеет метод GetData, который возвращает DataTable, заполненный из базы данных, тесты вашей бизнес-логики c могут смоделировать этот метод этого класса и вернуть консервированный DataTable, поэтому доступ к базе данных не требуется.

Тогда модель - это сами данные. Если вы используете стандартный ADO. NET, вам не нужна выделенная модель, поскольку вы уже используете DataTables и, возможно, DataSets. Вы можете создать собственные выделенные классы моделей, а затем сопоставить их с DataTables.

. Затем докладчик является посредником между уровнем доступа к данным и уровнем представления. Он просто перемещает данные между представлением и уровнем доступа к данным.

...