这是我在 Microsoft 测试 IIS URL Rewrite 模块的方法(它是基于命令行的,但也适用于 VS):
- 通过将源代码移动到 cpp 文件并在需要时使用前向声明来确保您的头文件是可使用的。
- 编译代码以作为库 (.lib) 进行测试
- 将您的 UnitTest 项目创建为支持 CLR 的 C++。
- 包括您的头文件。
- 包含您的 .lib 文件。
- 添加对 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 的引用
- 使用一个非常小的类来声明您的单元测试并像这样从托管代码跳转到 C++/Native 代码(可能有拼写错误):
这是一个例子:
// 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() 本机函数。没有宏,没有技巧,直截了当。
现在,头文件是可选的,但它可以用来暴露带有 C++ 原生签名的 Assert 类的方法(例如 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)
HTH