The class I\'m faking:
// Machine generated IDispatch wrapper class(es) created with Add Class from Typelib Wizard
// CPmacDevice wrapper class
class CPmacDevice : public COleDispatchDriver
{
public:
CPmacDevice(){} // Calls COleDispatchDriver default constructor
CPmacDevice(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CPmacDevice(const CPmacDevice& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
// Attributes
public:
// Operations
public:
// IPmacDevice methods
public:
void Open(long dwDevice, BOOL * pbSuccess)
{
static BYTE parms[] = VTS_I4 VTS_PBOOL ;
InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice, pbSuccess);
}
void Close(long dwDevice)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x2, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice);
}
void DataStart(long dwDevice, long resolution, long period)
{
static BYTE parms[] = VTS_I4 VTS_I4 VTS_I4 ;
InvokeHelper(0x5, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice, resolution, period);
}
void DataStop(long dwDevice)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice);
}
void DataCollect(long dwDevice, VARIANT * pvArray, BOOL * pbSuccess)
{
static BYTE parms[] = VTS_I4 VTS_PVARIANT VTS_PBOOL ;
InvokeHelper(0x7, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice, pvArray, pbSuccess);
}
void DPRBackGroundVar(long dwDevice, BOOL bOn)
{
static BYTE parms[] = VTS_I4 VTS_BOOL ;
InvokeHelper(0x8, DISPATCH_METHOD, VT_EMPTY, NULL, parms, dwDevice, bOn);
}
/ IPmacDevice properties
public:
};
The test using MSTEST with VS2019:
#include \"pch.h\"
#include \"CppUnitTest.h\"
#include \"Isolator.h\"
#include \"XrmMotionHandler.h\"
#include \"XrmMotionController.h\"
#include \"XrmTechnosoftMotionController.h\"
#include \"CPmacDevice.h\"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace XrmMotionUnitTests
{
TEST_CLASS(XrmDeltaTauMotionControllerUnitTests_MockCPmacDeviceTests)
{
public:
TEST_CLASS_INITIALIZE(Setup)
{
static bool bTestCreatedKey = false;
HKEY hKey;
string strKey = \"System\\\\CurrentControlSet\\\\Services\\\\Pmac\\\\pmaceth0\";
string strIPAddressName = \"IPAddress\";
string strIPAddress = \"172.24.68.50\";
DWORD dwType = REG_DWORD;
DWORD dwSize, dwValue;
string strKeyDevice = \"System\\\\CurrentControlSet\\\\Services\\\\Pmac\\\\Device0\";
string strLocation = \"Location\";
DWORD nDataLength = 4;
DWORD nLocationValue = 3; // magic number of some sort
string strEnumeration = \"Enumeration\";
DWORD nEnumerationValue = 0;
HKEY hKey2;
// set up the pmac registry information so that we can
// proceed with the checks before starting the test
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, strKey.c_str(), &hKey) != ERROR_SUCCESS)
{
bTestCreatedKey = true;
if (RegCreateKeyExA(HKEY_LOCAL_MACHINE, strKey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS)
{
Assert::Fail(L\"Failed to create pmaceth0 key in registry\");
}
}
dwSize = 4;
dwValue = htonl(843323564);
if (RegQueryValueEx(hKey, L\"IPAddress\", nullptr, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
{
if (RegSetKeyValueA(hKey, NULL, strIPAddressName.c_str(), REG_DWORD, (LPBYTE)&dwValue, dwSize) != ERROR_SUCCESS)
{
Assert::Fail(L\"Failed to create IPAddress key in registry\");
}
}
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, strKeyDevice.c_str(), &hKey2) != ERROR_SUCCESS)
{
if (RegCreateKeyExA(HKEY_LOCAL_MACHINE, strKeyDevice.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey2, NULL) != ERROR_SUCCESS)
{
Assert::Fail(L\"Failed to create Device0 key in registry\");
}
}
if (RegQueryValueEx(hKey, L\"Location\", nullptr, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
{
if (RegSetKeyValueA(hKey2, NULL, strLocation.c_str(), REG_DWORD, &nLocationValue, nDataLength) != ERROR_SUCCESS)
{
Assert::Fail(L\"Failed to create Location key in registry\");
}
}
if (RegQueryValueEx(hKey, L\"Enumeration\", nullptr, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
{
if (RegSetKeyValueA(hKey2, NULL, strEnumeration.c_str(), REG_DWORD, &nEnumerationValue, nDataLength) != ERROR_SUCCESS)
{
Assert::Fail(L\"Failed to create Enumeration key in registry\");
}
}
}
TEST_METHOD(OpenEthernetDeviceWithExceptionThrown)
{
// As a general recommendation, we should always use the
// AAA unit test pattern (Arrange - Act - Assert)
XrmDeltaTauMotionController* pDeltaTau = nullptr;
//**********************************************************
// Arrange (create and/or initialize the test variables specifically for this test case)
//**********************************************************
exception openFailure(\"Open threw an exception\");
CPmacDevice* cpMac = FAKE_ALL<CPmacDevice>();
XrmMotionHandler* motionHandler = XrmMotionHandler::GetTheMotionHandler(true);
int controllerCount = motionHandler->GetTotalMotionControllersDefined();
for (int i = 0; i < controllerCount; i++)
{
if (motionHandler->GetMotionController(i)->GetControllerType() == XrmMotionTypes::DELTA_TAU)
{
pDeltaTau = static_cast<XrmDeltaTauMotionController*>(motionHandler->GetMotionController(i));
WHEN_CALLED(cpMac->CreateDispatch(_)).Return(1);//Throw(&openFailure);
WHEN_CALLED(cpMac->Open(_, _)).Throw(&openFailure);
pDeltaTau->SetCPmacDevice(cpMac);
break;
}
}
//**********************************************************
// Act (execute the test actions)
//**********************************************************
pDeltaTau->Initialize();
//**********************************************************
// Assert (test state/results to ensure outcome is the expected result)
//**********************************************************
}
TEST_CLASS_CLEANUP(Teardown)
{
ISOLATOR_CLEANUP();
}
};
}