Вот подход, который я использую для тестирования модуля перезаписи URL IIS в Microsoft (он основан на командной строке, но должен работать и для VS):
- Убедитесь, что ваши заголовочные файлы пригодны для использования, переместив исходный код в файлы cpp и используя при необходимости предварительное объявление.
- Скомпилируйте ваш код для проверки в виде библиотеки (.lib)
- Создайте свой проект UnitTest как C ++ с поддержкой CLR.
- Включите ваши заголовочные файлы.
- Включите ваши .lib файлы.
- Добавить ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
- Используйте действительно маленький класс для объявления вашего модульного теста и переходите от управляемого к C ++ / родному коду, как этот (может иметь опечатки):
Вот пример:
// Example
#include "stdafx.h"
#include "mstest.h"
// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
// Arrange
Adder yourNativeObject;
int expected = 3;
int actual;
// Act
actual = yourNativeObject.Add(1, 2);
// Assert
Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}
// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
[TestMethod]
void AddTwoNumbersTest() {
// Just jump to C++ native code (above)
::AddTwoNumbersTest();
}
};
При таком подходе людям не нужно слишком много изучать C ++ / CLI, весь настоящий тест будет выполнен на родном C ++, а класс TestShim будет использоваться для «публикации» теста в MSTest.exe ( сделать его видимым).
Для добавления новых тестов вы просто объявляете новый метод [TestMethod] void NewTest () {:: NewTest ();} и новую встроенную функцию void NewTest (). Никаких макросов, никаких хитростей, просто.
Теперь, заголовочный файл необязателен, но его можно использовать для предоставления методов класса Assert с собственными сигнатурами C ++ (например, wchar_t * вместо Stirng ^), так что вы можете держать его близко к C ++ и далеко от него. C ++ / CLI:
Вот пример:
// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
static void AreEqual(int expected, int actual) {
Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
}
static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
}
template<typename T>
static void AreEqual(T expected, T actual) {
Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
}
// Etcetera, other overloads...
}
#pragma managed(pop)
НТН