NSubstitute и издевательство над объектом для запуска события

В настоящее время я использую NSubstitute в качестве своей насмешливой структуры, и у меня все хорошо, за одним исключением, которое...

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

Public Interface IMockObject
    Event MyMockedEvent( someId as Integer )
    Sub MyRoutineThatInvokesMyMockedEvent( someId as Integer)
End Interface

... поэтому в моем модульном тесте мне нужно смоделировать «MyRoutineThatInvokesMyMockedEvent», чтобы получить идентификатор, а затем поднять «MyMockedEvent». До сих пор я придумал...

Dim mockedObject = Substitute.For(Of IMockObject)()
mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) 'RaiseTheEventHere )

... но я застрял на фактически инициировании события со следующим недействительным...

mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) RaiseEvent MyMockedEvent(999) )

... У меня есть теория, что это может быть невозможно в VB.NET (без создания вспомогательной процедуры), но я буду рад любой помощи в том, как добиться вышеуказанного без вспомогательной процедуры.


person SeanCocteau    schedule 16.08.2012    source источник
comment
Если вы тестируете свой издевательский объект, вы проверяете, что вы можете издеваться над объектом, а не то, что объект реализован правильно. Вы, кажется, делаете это неправильно.   -  person Sebastien    schedule 02.03.2017


Ответы (1)


Хорошо, нашел ответ. Или что-то в этом роде.

Я считаю, что проблема связана с используемым определением события: путем перенастройки «MyMockedEvent» для использования собственного «MyMockedEventArgs» (наследующего от System.EventArgs) событие может быть вызвано без жалоб на прохождение через неподходящий тип.

mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) RaiseEvent IMockObject.MyMockedEventEventHandler() )

Но именно здесь мои подозрения в том, что VB.NET занимается какой-то черной магией, вступают в игру, поскольку я знаю, что VB.NET создает делегатов для события за кулисами. Конечно, тот факт, что Intellisense не показывает EventHandler, также не особенно помогает, и я предполагаю, что мог бы вручную закодировать делегата, но этот подход кажется более быстрым.

ХТН

person SeanCocteau    schedule 16.08.2012