Как выполнить модульное тестирование кода VBA?- Два разных указателя - PullRequest
0 голосов
/ 25 апреля 2018

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

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

Все остальные мои методы тестирования такие же, как в примере, за исключением этого метода, в котором я создал следующие строки - иначе при запуске теста ничего не происходит.

Public Sub Run(ByVal dataService As IDataService, ByVal wsService As IWorksheetService)
Dim data As Variant                   'Added this line
data = dataService.GetSomeTable       'Added this line
Call wsService.WriteAllData(data)     'Added this line
End Sub

И вот где я вижу код, идущий на юг ...

'@TestMethod
Public Sub WorksheetServiceWorksOffDataFromDataService()
    'Arrange
    Dim dataServiceStub As MyDataServiceStub
    Set dataServiceStub = New MyDataServiceStub
    Dim expected As LongLong
    expected = VarPtr(dataServiceStub.GetSomeTable)  'expected creates an Array

Dim wsServiceStub As MyWorksheetServiceStub
Set wsServiceStub = New MyWorksheetServiceStub

'Act
With New MyTestableMacro
    .Run dataServiceStub, wsServiceStub 'here we create a second array
End With

Dim actual As LongLong
actual = wsServiceStub.WrittenArrayPointer 'here we point to the address of the second array

'Assert
Assert.AreEqual expected, actual  ' this test fails cause it points to two different addresses
End Sub

Мне пришлось изменить тип с Long как в учебнике для указателей массива на LongLong из-за того, что числона 64 бит слишком длинный для Long.LongPtr также работал

1 Ответ

0 голосов
/ 25 апреля 2018

VarPtr - это то, что искусственно усложняет этот тест, вводя логику хрупкого и некорректного указателя, которой не должно быть.


Измените службу данных заглушки, чтобы она возвращала некоторые непустые данные -буквально все будет делать:

Option Explicit
Implements IDataService
'@Folder "Services.Stubs"

Private Function IDataService_GetSomeTable() As Variant
    IDataService_GetSomeTable = GetSomeTable
End Function

Public Function GetSomeTable() As Variant
    Dim result(1 To 50, 1 To 10) As Variant
    result(1, 1) = "test"
    GetSomeTable = result
End Function

Теперь измените службу рабочего листа, чтобы сохранить копию фактических данных (а не просто LongPtr):

Option Explicit
Implements IWorksheetService
'@Folder "Services.Stubs"

Private Type TStub
    WasWritten As Boolean
    WrittenData As Variant
End Type
Private this As TStub

Private Sub IWorksheetService_WriteAllData(ByRef data As Variant)
    this.WasWritten = True
    this.WrittenData = data
End Sub

Public Property Get DataWasWritten() As Boolean
    DataWasWritten = this.WasWritten
End Property

Public Property Get WrittenData() As Variant
    WrittenData = this.WrittenData
End Property

Теперь изменитетест для подтверждения того, что IDataService.GetSomeTable возвращает те же данные , с которыми работает IWorksheetService.WriteAllData - вы можете сделать это с помощью Assert.SequenceEquals, который сравнивает все элементы двух массивов и завершается неудачей, если что-то отличается:

'@TestMethod
Public Sub WorksheetServiceWorksOffDataFromDataService()
    'Arrange
    Dim dataServiceStub As StubDataService
    Set dataServiceStub = New StubDataService
    Dim expected As Variant
    expected = dataServiceStub.GetSomeTable

    Dim wsServiceStub As StubWorksheetService
    Set wsServiceStub = New StubWorksheetService

    'Act
    With New Macro
        .Run dataServiceStub, wsServiceStub
    End With

    Dim actual As Variant
    actual = wsServiceStub.WrittenData

    'Assert
    Assert.SequenceEquals expected, actual
End Sub

Это значительно упрощает тест и проходит:

Passing tests in Rubberduck test explorer


Я буду обновлять статью этимболее простой тест позже сегодня.

...