Visual studio 检测Visual Studio测试是否正在运行

Visual studio 检测Visual Studio测试是否正在运行,visual-studio,tdd,mstest,Visual Studio,Tdd,Mstest,是否有一种简单的方法可以检测您是否在VisualStudio测试的上下文中运行,而不是在调试或发布环境中运行 这是一个场景-我们有一个工厂类,我们在现有的代码库中大量使用它,我想不是在每个类中重构它,而是用一个返回模拟/伪对象的工厂来替换默认工厂,如果factory类检测到它正在“测试”模式下运行,我可以在factory类本身中添加一些东西来返回这些模拟对象。我认为将测试用例代码与域代码混合使用不是一个好主意 我建议您为工厂提供一个接口,并为该接口实现mock以进行测试 更好的是,您可以使用诸如

是否有一种简单的方法可以检测您是否在VisualStudio测试的上下文中运行,而不是在调试或发布环境中运行


这是一个场景-我们有一个工厂类,我们在现有的代码库中大量使用它,我想不是在每个类中重构它,而是用一个返回模拟/伪对象的工厂来替换默认工厂,如果factory类检测到它正在“测试”模式下运行,我可以在factory类本身中添加一些东西来返回这些模拟对象。

我认为将测试用例代码与域代码混合使用不是一个好主意

我建议您为工厂提供一个接口,并为该接口实现mock以进行测试


更好的是,您可以使用诸如Rhinomock之类的模拟框架。

我同意mcabral关于原因的评估(我认为重构是值得的),但就机制而言

在VisualStudio中,您可以在解决方案和项目级别定义除“调试”和“发布”之外的任意数量的配置。因此,您可以创建一个“测试”配置,很可能是基于调试配置。接下来,在包含factory类的项目中创建一个“测试”配置

在“项目属性”窗口中,选择“生成”选项卡。选择“测试”配置并定义条件编译符号:“测试”

现在,在您的代码中,您可以使用

#if TESTING
     // build stubs
#else
     // build real implementations
#endif

你听说过依赖注入或IOC吗?这种情况正是他们的目的

因此,我建议使用IOC容器来提供对象,而不是自定义工厂。如果您对其中一些产品有特殊要求,可以将工厂放在IOC容器中


然后,您可以在测试中以不同的方式配置容器(或者根本不使用它),并且该代码将保留在主代码之外。

您可以测试当前流程的可执行文件。它不是很优雅,但很管用

if (Process.GetCurrentProcess().ProcessName.ToLower().Contains("vstest.executionengine"))
{
  // we are in a ms unit test
}
else
{
  // normal programm execution
}

是的,那是我们的选择。我们只是将我们的主要代码库引入TDD,并试图避免更大的麻烦,比如修改每个模型类,所以我想我会问。我们计划使用一个模拟框架,一直在玩NMock。对位:是的,那会有用的。我在想一些更接近于如何调用HttpContext.Current.isdebuggingsenabled的东西,但用于测试。我可能会选择重构的路线,因为我们最终还是要做的。谢谢你的建议。DI很好,但是知道像这样的答案是很好的