Возможно ли модульное тестирование класса, который выполняет вызовы P / Invoke?

StackOverflow https://stackoverflow.com/questions/53439

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top