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
Это значительно упрощает тест и проходит:
Я буду обновлять статью этимболее простой тест позже сегодня.