我正在使用的当前产品是用C编写的 Windows服务,并且所有新功能都将为其编写单元测试.但是这会产生一个有趣的问题(对我来说至少)我们会针对各种事情做很多Win32调用并相应地运行,所以为了完成单元测试,测试各种输出会很好,而不仅仅是当前系统州.

我的问题是模拟Win32调用结果的最佳方法是什么?我考虑过两种不同的方法:

1)将所有使用的Win32调用放入函数指针,并将它们传递给使用它们的函数或类(取决于它们被击中的次数),并使用它来获取模拟结果.

2)到处都有很多#ifdef UNITTEST,如果它正在调用我自己的特殊方法,或者如果没有则调用正常的方法.

我完全偏离这里,还是错过了一个基本知识?

关于(2),采用字符串参数的大多数Win32函数已经将它们的公共形式定义为宏,例如,来自WinUser.h:
WINUSERAPI
int
WINAPI
MessageBoxA(
    __in_opt HWND hWnd,__in_opt LPCSTR lpText,__in_opt LPCSTR lpCaption,__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    __in_opt HWND hWnd,__in_opt LPCWSTR lpText,__in_opt LPCWSTR lpCaption,__in UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

您当然可以在项目中添加标题,重新定义要模拟的API函数:

#ifdef UNITTEST
#undef MessageBox
#define MessageBox UnitTestMessageBox
#endif

通过重新定义名称,您可以避免在整个源代码中散布大量条件编译.

模拟和Win32 API调用的更多相关文章

  1. 更改整个控制台背景颜色(Win32 C)

    如何更改整个控制台的背景颜色?

  2. 并排运行WPF / Win32应用程序的性能问题?

    闪烁是资源不足时通常会获得的类型,您可以在其中看到单个元素闪烁并逐渐绘制到屏幕上.如果有人有任何建议/想法,请告诉我们.每个进程都有自己的消息泵–这是不共享的.如果您没有看到高cpu利用率,那么WPF正在使用硬件渲染,因此它可能是GPU饱和度.你能获得有关GPU利用率的信息吗?

  3. Microsoft.Win32.TaskScheduler NOT FOUND – 我想在VB.NET中导入这个命名空间

    我一直在寻找与Windows任务计划程序接口的示例代码,其中大多数都导入了命名空间:当我去导入它时,它在Win32中不存在.有谁知道为什么我不能导入它?

  4. wpf – Microsoft.Win32.OpenFileDialog.ShowDialog()何时返回null?

    OpenFileDialog的ShowDialog方法返回一个可以为空的布尔值,如果用户单击确定则设置为true,如果单击取消则设置为false.什么时候返回null?

  5. MinGW没有定义WIN32,预处理器指令中的错误

    我正在使用mingw32-make将项目编译到Windows,这依赖于一个名为libevent2的项目.我一直收到这个错误–显然,试图包含来自LinuxAPI的文件,这在Windows上不起作用.经过进一步调查后,我发现只有在未定义WIN32时才应包含此文件.您应该使用_WIN32并且可能还想检查__CYGWIN__

  6. 重新创建Win32的标题是一个好主意吗?

    我发现自己最近在Win32上做了更多的C/C++代码,并且来自C#背景我已经开发出一种完全一致的“干净代码”的痴迷,所以从美丽的System.*命名空间转回到构成Win32API头文件的#defines的混搭是一种文化冲击.在阅读了MSDN按字母顺序排列的Win32核心函数列表之后,我意识到Win32的API设计实际上是多么简单,不幸的是它被过去25年的所有瑕疵笼罩着,包括许多对16位编程的引用,

  7. Win32控制台应用程序中的对话框和小部件库(在C中)

    我见过很多控制台应用程序,里面有一些对话框和小部件.比如说:还有更多.现在我的问题是:是否有任何库(在C中)用于在Win32控制台应用程序中创建对话框和小部件?本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. 模拟和Win32 API调用

    关于,采用字符串参数的大多数Win32函数已经将它们的公共形式定义为宏,例如,来自WinUser.h:您当然可以在项目中添加标题,重新定义要模拟的API函数:通过重新定义名称,您可以避免在整个源代码中散布大量条件编译.

  9. 使用宏WIN32或_MSC_VER跨平台

    我正在Linux(GCC4.4.2)和WindowsVSCExpressEdition2008下编译我目前正在WindowsXPPro32位下编译,并已将其添加到我的源代码中.但是,if语句中的代码被禁用(变灰).但是,如果我执行以下操作:if语句代码已启用.我只是想知道,我应该使用什么.我见过许多程序员使用WIN32.但是,似乎对我没用.我应该使用_MSC_VER吗?非常感谢任何建议,没有WIN

  10. Windows – MS.Win32.Penimc.UnsafeNativeMethods Visual Studio 2015和Sql Server Management Studio 2012

    在我的机器上安装补丁KB3186497后,我收到以下错误.我遇到了类似的问题,罪魁祸首是Microsoft.Net4.7Framework.我不得不卸载4.7然后安装4.6版本.现在它工作正常.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部