Возможно ли провести модульное тестирование класса, который выполняет вызовы P / Invoke? - PullRequest
7 голосов
/ 10 сентября 2008

Я хочу обернуть фрагмент кода, использующий API-интерфейс Windows Impersonation, в аккуратный маленький вспомогательный класс, и, как обычно, я ищу способ пройти тестирование первым. Однако, хотя WindowsIdentity является управляемым классом, вызов LogonUser, необходимый для фактического выполнения входа в систему как другого пользователя, является неуправляемой функцией в advapi32.dll.

Я думаю, что могу обойти это, введя интерфейс для моего вспомогательного класса, чтобы использовать и скрыть вызовы P / Invoke в реализации, но тестирование этой реализации все еще будет проблемой. И вы можете себе представить, что на самом деле выполнение олицетворения в тесте может быть немного проблематичным, учитывая, что пользователю фактически необходимо существовать в системе.

Ответы [ 2 ]

12 голосов
/ 10 сентября 2008

Указание: не проверяйте код, который вы не написали.
Вы не должны беспокоиться о том, что реализация WinAPI не работает (скорее всего, она работает как положено). Ваша задача - проверить «проводку», т. Е. Правильно ли ваш код выполняет правильный вызов WinAPI. В этом случае все, что вам нужно, - это смоделировать интерфейс и позволить фреймворк-фреймворку сказать, сделан ли вам вызов с правильными параметрами. Если да, то все готово.

  • Создание IWinAPIFacade (с соответствующими методами WinAPI) и реализация CWinAPIFacade.
  • Напишите тест, который включает макет IWinAPIFacade и убедитесь, что сделан соответствующий вызов
  • Написать тест, чтобы убедиться, что CWinAPIFacade создан и подключен по умолчанию (при нормальном функционировании)
  • Реализация CWinAPIFacade, которая просто слепо делегирует вызовы Platform Invoke - нет необходимости автоматически проверять этот уровень. Просто сделайте ручную проверку. Надеюсь, это не изменится так часто и ничего не сломается. Если вы обнаружите, что он сделает в будущем, забаррикадируйте его некоторыми тестами.
0 голосов
/ 10 сентября 2008

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

Итак, просто создайте свой интерфейс в классе-обёртке и протестируйте его?

Что касается необходимости настраивать пользователей и т. Д., Я думаю, это будет пуля, которую вам нужно укусить. Было бы странно издеваться над вызовом оболочки PInvoke, так как вы просто подтвердили бы, и интерфейс существует:)

...