我希望能够以部分信任的方式运行 MSTest。这将允许我配置我的单元测试调用的代码可以做什么和不能做什么。
我试图解决的问题是让我的自动化(单元)测试在使用文件系统、数据库、系统时钟和其他外部资源之类的东西时失败。通过以部分信任运行,我可以配置 AppDomain 可以执行和不可以执行的操作类型。这使我能够检测代码中未正确抽象出已使用资源的位置。
如果还有其他方法可以实现这一点,请告诉我。
我希望能够以部分信任的方式运行 MSTest。这将允许我配置我的单元测试调用的代码可以做什么和不能做什么。
我试图解决的问题是让我的自动化(单元)测试在使用文件系统、数据库、系统时钟和其他外部资源之类的东西时失败。通过以部分信任运行,我可以配置 AppDomain 可以执行和不可以执行的操作类型。这使我能够检测代码中未正确抽象出已使用资源的位置。
如果还有其他方法可以实现这一点,请告诉我。
不幸的是,MSTest 没有对此的内置机制,并且 .NET 4.0 中对 CAS 策略应用程序的更改严重限制了对此支持的方法。
最简单的方法是限制 MSTest 创建的 AppDomain 上的 CAS 权限授予,以在特定测试程序集中运行测试。但是,当前版本的 MSTest 不允许拦截和/或自定义 AppDomain 创建。我们无法通过将代码添加到 AssemblyInitialize 方法来解决此问题,因为在代码开始在 AppDomain 中运行后所做的 AppDomain 策略更改无效。
这基本上给我们留下了一个单一的支持机制来应用 CAS 权限限制进行测试:从测试方法或调用测试方法的代码中应用 PermissionSet.PermitOnly。例如:
[TestMethod]
public void SomeTest()
{
SomeStaticTestUtilityClass.TargetPermissionSet.PermitOnly();
// Run the rest of your test code here.
}
可以使用http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-中描述的方法通过自定义测试属性来做到这一点类型部分 1.aspx。但是,我还没有对此进行测试,并且我不确定测试方法调用机制是否允许以某种方式应用 PermitOnly,从而导致它出现在测试代码的调用堆栈上。
如果您有很多这些要编写和使用自定义 ITestMethodInvoker 要么不起作用或不合适,那么另一种选择是使用PostSharp之类的后编译器来插入 PermitOnly 调用。
如果这些都不适合,并且您没有与 MSTest 结婚,您可能还需要考虑将您的测试框架更改为更易于扩展的框架。