Лучшее понимание юнит-тестирование в VBA от не возврата функции


Я всегда хотел, чтобы запустить юнит-тестирование мой код, и закончившейся на прошлой неделе я скачал Rubberduck раз (первый раз было слишком мало информации, как это сделать для меня), но после просмотра этого видео модульного тестирования, я решил, что это выглядит достаточно просто.

Так что все выходные я читал и смотрел видео и разволновалась больше, - потому что в понедельник я пойду через мой последний проект, и использовать модульные тесты!!

А может и нет... я в первом классе мой, и я действительно не вижу много мест, которые я могу сделать, модульное тестирование - смысла не много вернуть функции со значением до испытаний.

Длинные и короткие из этого класса заключается в том, что я унаследовал таблицу с большим количеством данных за все места, да так, что я даже не могу добавить или удалить строку, не нарушая формулы (правдивая история). В любом случае, я сделал новую страницу, загруженную информацию из БД в эту простыню, и оттуда я делаю передачу данных с инфицированного пациента (как упоминалось выше) каждый раз, когда мне нужно обновить информацию.

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

Option Explicit
Private firstTruckColm As Long
Private truckRow As Long
Private numberOfShops As Long
Private numberOfProducts As Long
Private wb As Workbook
Private laailys As Worksheet
Private bloem As Worksheet
Private bloemShopNamesStartRow As Long
Private bloemShopNamesStartColm As Long

Public Sub loadTrucksInit()

    Call initValues
    Call insertShopNamesAndProd

End Sub

Private Sub initValues() 'Loads values from a "settings" module. (Any thoughts on this)'

    firstTruckColm = mdl_settings.returnLaailysFirstTruckColm
    truckRow = mdl_settings.returnLaailysTruckRow
    numberOfShops = mdl_settings.returnNumberOfBloemShops
    numberOfProducts = mdl_settings.returnNumberOfBloemProducts
    Set wb = ThisWorkbook
    Set laailys = wb.Sheets("Laailys")
    Set bloem = wb.Sheets("Bloem")
    bloemShopNamesStartRow = mdl_settings.returnBloemShopNamesStartRow
    bloemShopNamesStartColm = mdl_settings.returnBloemShopNamesStartColm

End Sub

Private Sub insertShopNamesAndProd()
    Dim a As Long
    For a = 1 To numberOfShops
        With laailys
            .Cells(truckRow, firstTruckColm + a - 1).Value = bloem.Cells(bloemShopNamesStartRow, bloemShopNamesStartColm + a).Value
        End With
        Call goThroughProducts(bloemShopNamesStartColm + a, firstTruckColm + a - 1)
    Next a
End Sub

Private Sub goThroughProducts(colmToUseBloem As Long, colmToUseLaailys As Long)
    Dim a As Long
    For a = bloemShopNamesStartRow + 1 To numberOfProducts + bloemShopNamesStartRow
        If bloem.Cells(a, colmToUseBloem).Value <> vbNullString Then
            Call insertProducts(bloem.Cells(a, 1).Value, bloem.Cells(a, colmToUseBloem).Value, colmToUseLaailys)
        End If
    Next a
End Sub

Private Sub insertProducts(productCode, prodAmount, colmToUseLaailys)
    Dim a As Long
    Dim checker As Boolean
    checker = False
    For a = 1 To 200
        If laailys.Cells(a, 4).Value = productCode Then
            laailys.Cells(a, colmToUseLaailys).Value = prodAmount
            checker = True
            Exit Sub
        End If
    Next a
    If checker = False Then
        MsgBox productCode & " did not read in correctly, make sure the product code in 'Laailys' is the same as in 'Bloem'"
    End If
End Sub

Несколько других вопросов, которые я также хочу знать, если это возможно:

  1. Мне нравится initValues метод, который загружает все свойства, которые я буду использовать в моем классе все сразу в одном месте аккуратно, если мне нужно изменить любой. Это приемлемая практика?

  2. Я указываю на Колм значения, как firstTruckColm + a - 1Я должен сначала объявить еще одну переменную и дать это значение в переменной, так что мои доводы для других процедур выглядеть лучше?

  3. Я должен изменить мои Сабы функций с возвращаемым значением, так как большинство я могу?



117
1
задан 9 апреля 2018 в 12:04 Источник Поделиться
Комментарии
1 ответ

Вы говорите, что это класс, но у вас нет ничего выступающими из него. Я имею в виду, если я создаю экземпляр этого класса, я ничего не могу сделать с ним. Я не могу Get или Let любые свойства, и я не могу использовать любой из Private методы.

Звоните

Вам не нужно Call Sub больше. Вам также не нужно заключать ваши аргументы. Е. Г.

goThroughProducts somecolumn + a, somecolumn + a - 1

Листы

Листы имеют CodeName свойства - просмотр свойств окна (Ф4) и (Name) поля (в верхней части) может быть использован как имя листа. Таким образом, вы можете избежать Sheets("mySheet") и вместо того, чтобы просто использовать mySheet.

Именования

Возможно, некоторые из этого нет в английском и поэтому я не понимаю смысл, но ваш именования можно улучшить. Я не знаю, что laailys лист может быть. Также можно использовать продукт и прод оба. Стараюсь оставаться последовательным и ясно с вашим именованием. Что checker проверка? Это типа boolean, так что обычно вы называете это что-то вроде isMatch.

Также логическое инициализируется как False поэтому нет необходимости, чтобы установить его в качестве ложного.

Класс

Это кажется странным, чтобы иметь класс см. ThisWorkbook. Какова ваша цель в этом классе? Я не вижу ничего, что нельзя сделать с уже существующими объектами.

Бывал

Все ваши аргументы передаются ByRef имплицитно. Вы хотите пройти ByVal всякий раз, когда это возможно. например

Private Sub InsertProducts(ByVal productCode As Long, ByVal productAmount As Long, ByVal targetColumn As Long

Набрав

Вы будете замечать, я дал свои переменные типа выше. В противном случае они неявно вариантов, которые не нужны.

Петли

В InsertShopNamesAndProd у вас есть вызов процедуры в цикле и с:


For a = 1 To numberOfShops
With laailys
.Cells(truckRow, firstTruckColm + a - 1).Value = bloem.Cells(bloemShopNamesStartRow, bloemShopNamesStartColm + a).Value
End With
Call goThroughProducts(bloemShopNamesStartColm + a, firstTruckColm + a - 1)
Next a

И в этой процедуре у вас есть еще один звонок в цикле -


For a = bloemShopNamesStartRow + 1 To numberOfProducts + bloemShopNamesStartRow
If bloem.Cells(a, colmToUseBloem).Value <> vbNullString Then
Call insertProducts(bloem.Cells(a, 1).Value, bloem.Cells(a, colmToUseBloem).Value, colmToUseLaailys)
End If
Next a

Это кажется довольно однообразным. Вместо того, чтобы думать о рефакторинге эти процедуры так, что вы берете все продукты в массив, пройти через свои магазины и вставить продукты, как вы работаете.

Если

Здесь


If bloem.Cells(a, colmToUseBloem).Value <> vbNullString Then
Call insertProducts(bloem.Cells(a, 1).Value, bloem.Cells(a, colmToUseBloem).Value, colmToUseLaailys)
End If

Можно поставить на одну линию. И здесь


Dim checker As Boolean
checker = False
For a = 1 To 200
If laailys.Cells(a, 4).Value = productCode Then
laailys.Cells(a, colmToUseLaailys).Value = prodAmount
checker = True
Exit Sub
End If
Next a
If checker = False Then
MsgBox productCode & " did not read in correctly, make sure the product code in 'Laailys' is the same as in 'Bloem'"
End If

Я не уверен, как вы можете добраться до второго If без проверки является ложной.

Вы можете также использовать логическое в if как сам тест:

If Not checker Then

Модуль настройки

Вы используете свой "настройки" модуль для получения объектов и строк? Это звучит не очень хорошо. Параметры должны быть загружены и сохранены, чтобы они могли быть сброшены. Что ты делаешь, это заполнение так называя его параметры не совсем точно.

0
ответ дан 12 апреля 2018 в 04:04 Источник Поделиться