如何对使用PrincipalPermission属性修饰的代码进行单元测试?
例如,这是可行的:
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var c = new MyClass();
}
}
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Users")]
class MyClass
{
public MyClass()
{
Console.WriteLine("This works.");
}
}这将抛出一个SecurityException:
[TestClass]
public class UnitTest1
{
[TestInitialize]
public void TestInitialize()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
}
[TestMethod]
public void TestMethod1()
{
var c = new MyClass();
}
}有什么想法吗?
发布于 2009-07-10 12:21:25
在您的测试中创建一个GenericIdentity并将其附加到Thread.CurrentPrincipal中怎么样:
[TestMethod]
public void TestMethod1()
{
var identity = new GenericIdentity("tester");
var roles = new[] { @"BUILTIN\Users" };
var principal = new GenericPrincipal(identity, roles);
Thread.CurrentPrincipal = principal;
var c = new MyClass();
}对于失败的测试,您可以:
[TestMethod]
[ExpectedException(typeof(SecurityException))] // Or whatever it's called in MsTest
public void TestMethod1()
{
var identity = new GenericIdentity("tester");
var roles = new[] { @"BUILTIN\NotUsers" };
var principal = new GenericPrincipal(identity, roles);
Thread.CurrentPrincipal = principal;
var c = new MyClass();
}发布于 2009-07-09 20:17:18
您可以尝试在测试方法中impersonating不同的用户,如果您以管理员身份运行代码,您可以在测试(或测试类)中创建一个本地用户帐户,并在最后删除它。
编辑:抱歉,我想象过使用impersonate来测试失败案例-我应该正确地阅读您的问题:)我有类似的单元测试,并且他们能够在mstest中创建本地帐户。这是否是好的做法则是另一回事。
我看到你已经按照this页面建议的那样做了:将应用程序域的主要策略设置为"WindowsPrincipal“。对我来说,Thread.CurrentPrincipal.Identity.Name提供了我的用户名,并通过了VS2005和VS2008的测试,目标是.NET 2.0,3.0和3.5。
您是否在Vista/Win7上运行UAC和非提升的VS?否则,您是否能够使用不同的组在另一台计算机上进行复制,或者在您的计算机上创建另一个本地管理员帐户并以此用户身份运行测试?
https://stackoverflow.com/questions/1106163
复制相似问题