Как выполнить модульное тестирование invoke-метода WPF Triggeraction - PullRequest
0 голосов
/ 13 ноября 2018

Я не могу понять, как провести модульное тестирование этого класса 'Invoke -Метод:

Option Strict On
Imports System.Windows.Interactivity

Public Class ViewErrorCounterAction
    Inherits TriggerAction(Of DependencyObject)

    Public Shared ReadOnly ViewErrorCounterProperty As DependencyProperty = DependencyProperty.Register("ViewErrorCounter",GetType(Integer),GetType(ViewErrorCounterAction))

    Sub New()
        ViewErrorCounter = 0 
    End Sub

    Public Property ViewErrorCounter As Integer
        Get
            Return CType(GetValue(ViewErrorCounterProperty), Integer)
        End Get
        Set
            SetValue(ViewErrorCounterProperty, Value)
        End Set
    End Property

    Protected Overrides Sub Invoke(parameter As Object)
        Dim e = CType(parameter, ValidationErrorEventArgs)
        If (e.Action = ValidationErrorEventAction.Added) Then
            ViewErrorCounter = ViewErrorCounter + 1
        ElseIf (e.Action = ValidationErrorEventAction.Removed) Then
            ViewErrorCounter = ViewErrorCounter - 1
        End If
    End Sub

End Class

Мне удалось вызвать метод invoke, а также передать правильный параметр с помощью этого кода, но я боролся с созданием объекта ValidationErrorEventArgs, поскольку его конструктор является внутренним:

Sub Invoke_ValidationerrorEventEinAufruf_ErrorCounterIst1()
    Dim _viewErrorCounterAction = New ViewErrorCounterAction
    dim _manualTrigger = New ManualTrigger
    _manualTrigger.Actions.Add(_viewErrorCounterAction)

    'This line won't work because the constructor is internal
    Dim ev = New ValidationErrorEventArgs(New ValidationError(Nothing, Nothing), ValidationErrorEventAction.Added)

    _manualTrigger.Invoke(ev)
    Dim result = _viewErrorCounterAction.ViewErrorCounter
    Assert.That(result, [Is].EqualTo(1))
End Sub

'with help of https://stackoverflow.com/a/12977944/2582968
Public Class ManualTrigger
    Inherits Interactivity.TriggerBase(Of DependencyObject)

    Public Sub Invoke(parameter As Object)
        Me.InvokeActions(parameter)
    End Sub
End Class

Я экспериментировал с Activator.CreateInstance, чтобы создать ValidationErrorEventArgs, но пока не увенчался успехом. Поскольку вся эта история с активатором кажется мне далекой от сложности обычного модульного теста, я был бы признателен за любые советы о том, как лучше всего протестировать этот код. Если активатор - мой единственный вариант, я буду рад некоторой помощи по созданию этого ValidationErrorEventArgs-Object.

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете создать ValidationErrorEventArgs, используя отражение:

Dim validationErrorEventArgsConstructorInfo As ConstructorInfo = GetType(ValidationErrorEventArgs) _
    .GetConstructors(BindingFlags.NonPublic Or BindingFlags.Instance) _
    .First()

Dim validationErrorEventArgsInstance As ValidationErrorEventArgs = validationErrorEventArgsConstructorInfo _
    .Invoke(New Object() {New ValidationError(New DataErrorValidationRule(), New Object()), ValidationErrorEventAction.Added})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...