2008-09-10 4 views
5

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

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

ответ

10

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

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

Это подход, который я взял, и я доволен им. Тем не менее, я все еще хочу, чтобы был способ проверить, что мой конкретный класс «делает правильные вещи», когда он вызывает Win32 api. :) – Rytmis 2008-10-31 11:24:08

+1

Существует. Это называется интеграционным тестированием. – nathanchere 2014-04-02 01:01:47

0

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

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

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

Смежные вопросы