Iată abordarea pe care o folosesc pentru a testa modulul IIS URL Rewrite la Microsoft (este bazat pe linia de comandă, dar ar trebui să funcționeze și pentru VS):
- Asigurați-vă că fișierele antet pot fi consumabile prin mutarea codului sursă în fișierele cpp și utilizând declarația înainte dacă este necesar.
- Compilați codul pentru a testa ca bibliotecă (.lib)
- Creați-vă proiectul UnitTest sub formă de C ++ cu suport CLR.
- Includeți fișierele cu antet.
- Includeți fișierele .lib.
- Adăugați o referință la Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
- Utilizați o clasă foarte mică pentru a declara unitatea de testare și a sări de la gestionat la C ++ / Codul nativ ca acesta (poate să aibă un text):
Iată un exemplu:
// 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();
}
};
Cu această abordare, oamenii nu trebuie să învețe prea multe chestii C ++ / CLI, tot testul real va fi făcut în C ++ nativ, iar clasa TestShim va fi utilizată pentru a "publica" testul la MSTest.exe (sau a face vizibil ).
Pentru adăugarea de noi teste, declarați o nouă metodă nouă [TestMethod] void NewTest() {:: NewTest ();} și o funcție nativă nouă NewTest (). Fără macros, fără trucuri, îndreptate.
Acum, fișierul heade este opțional, dar poate fi folosit pentru a expune metodele clasei Assert cu semnături native C ++ (de exemplu, wchar_t * în loc de Stirng ^), astfel încât să puteți să o păstrați aproape de C ++ și departe de C ++ / CLI :
Iată un exemplu:
// 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
static void AreEqual(T expected, T actual) {
Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
}
// Etcetera, other overloads...
}
#pragma managed(pop)
HTH