我希望能够以部分信任方式运行MSTest。这将允许我配置我的单元测试调用的代码可以做什么和不可以做什么。
我试图解决的问题是在使用文件系统,数据库,系统时钟和其他外部资源之类的东西时让我的自动(单元)测试失败。通过部分信任运行,我可以配置AppDomain可以执行和不执行的操作类型。这允许我检测代码中没有正确抽象掉已使用资源的位置。
如果还有其他方法可以实现此目的,请告知我们。
答案 0 :(得分:2)
不幸的是,MSTest没有内置的机制,并且.NET 4.0中对CAS策略应用程序的更改严重限制了支持的方法。
最简单的方法是限制MSTest创建的AppDomain上的CAS权限授予,以在特定的测试程序集中运行测试。但是,当前版本的MSTest不允许拦截和/或自定义AppDomain创建。我们无法通过向AssemblyInitialize方法添加代码来解决此问题,因为代码开始在AppDomain中运行后进行的AppDomain策略更改无效。
这基本上为我们提供了一种支持CAS权限限制的支持机制:在测试方法或调用测试方法的代码中应用PermissionSet.PermitOnly。 e.g:
[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-type-part-1.aspx中描述的方法通过自定义测试属性执行此操作。但是,我还没有对此进行测试,并且我不确定测试方法调用机制是否允许以某种方式应用PermitOnly,这会导致它出现在测试代码的调用堆栈中。
如果你有很多这些作者和使用自定义ITestMethodInvoker要么不起作用或者不适合,另一种选择是使用像PostSharp这样的后编译器来插入PermitOnly调用。
如果这些都不合适,并且您没有与MSTest结婚,那么您可能还需要考虑将测试框架更改为更易于扩展的测试框架。