Как я могу протестировать управляемую оболочку вокруг кода C?
Я буду создавать оболочку Managed-C++ вокруг некоторых функций C, чтобы разрешить ее использование в других решениях.NET. Я смотрю на обеспечение очень минималистской обертки, что-то вроде:
Подпись в заголовке C:
void DOSTH(const char*, short, long*);
Выставленный управляемый интерфейс:
public void doSomething(String^ input, short param, [Out] long^ %result);
Для этого мое решение будет иметь заголовки C и будет ссылаться на.dll, которая содержит скомпилированный C API, против которого я строю.
Как новичок в Visual Studio, я не уверен, как бы я тестировал этот модуль. Можно ли макет.dll, чтобы обеспечить имитацию реализации? Есть ли библиотека, которая облегчила бы такую задачу? Есть ли конкретная структура решения, к которой я должен стремиться, чтобы сделать это проще?
Любое руководство в этой области было бы замечательно. Поиски в Google оставили меня за дополнительной информацией о модульном тестировании управляемой оболочки.
2 ответа
В некоторых случаях (ограничения на инструменты и / или сложность зависимостей приходит мне на ум), вопрос о зависимости от использования внешних сред не обсуждается. Кроме того, существует совершенно законная техника написания макетов вручную (я думаю, это был способ сделать что-то до того, как популярность фреймворков стала популярной).
И это в основном то, что вы хотите сделать - фальсифицировать зависимость, которая в вашем случае оказывается библиотекой Си. Рамки не могут помочь - вы можете попробовать ручной подход.
Создайте некоторую простую, фальшивую реализацию (почти как заглушку, например, возвращающую только фиксированные значения независимо от входных параметров - естественно, она может быть более сложной, чем эта), скомпилируйте ее, позвольте ей выставлять точно такие же заголовки / функции и ссылайтесь на нее в ваш тестовый проект. Это основная идея подделки (окурков / насмешек) - один объект притворяется другим.
Как бы просто это ни звучало, на самом деле я этого не пробовал - принимайте это с недоверием и больше как совет, каким путем вы могли бы пойти. Ограничение этого подхода (помимо того, действительно ли это технически возможно) очень плохие / нет параметров конфигурации (поскольку дополнительная фальсифицированная DLL будет действовать как жестко закодированная заглушка - файлы конфигурации могут помочь, но это похоже на... слишком большую работу?).
Вам нужно только иметь возможность заглушить / смоделировать вашу оболочку, чтобы ваши тесты не полагались на нативный dll?
Затем вы можете объявить абстрактный базовый класс для вашей оболочки, написать одну реализацию, которая вызывает нативный dll, и другую для целей тестирования, которая возвращает готовые значения. Или вы можете использовать фреймворк, такой как Moq или Rhino.Mocks, чтобы высмеивать вашу обертку.