2009-07-09 47 views
19

你如何使用PrincipalPermission属性来装饰测试代码?MSTEST 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(); 
    } 
} 

任何想法?

+0

有趣......我跑相同TestDriven测试,并通过。在这种情况下,测试似乎以我的身份运行,但是当测试使用mstest运行时,CurrentPrincipal具有“空白”身份。有谁知道为什么? – 2009-07-09 20:58:54

回答

19

如何创建一个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(); 
} 
1

您可以在测试方法中尝试impersonating不同的用户,如果您以管理员身份运行代码,您可以在测试(或测试类)内部创建本地用户帐户,并在最后删除它。

编辑:对不起,我想用impersonate来测试一个失败案例 - 我应该正确地阅读你的问题:)我有类似的单元测试,他们能够在mstest中创建本地帐户。这是否是好的做法是另一回事。

我看你已经做了this页面建议:将应用程序域的主体策略设置为“WindowsPrincipal”。对于我来说,Thread.CurrentPrincipal.Identity.Name给出了我的用户名,并且测试通过使用VS 2005和VS 2008,目标是.NET 2.0,3.0 & 3.5。

您是否在Vista/Win7上运行UAC且未升高VS?否则,您是否可以在另一台计算机上重新生成,使用不同的组,或者在计算机上创建另一个本地管理员帐户并以该用户身份运行测试?

+0

当我运行测试时,CurrentPrincipal有一个未经身份验证的GenericIdentity,因此我不相信测试代码将能够创建或删除本地帐户。 – 2009-07-09 20:50:32

+0

我以管理员身份在XP上运行VS。雷的建议奏效,但让我担忧其他安全问题。看到我离开雷的评论。 – 2009-07-10 13:52:54