你如何单元测试代码饰有属性的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();
}
}
有任何想法吗?
如何创建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();
}
你可以尝试模仿的测试方法中的不同的用户,如果您运行的代码,管理员可以创建测试(或测试类)内的本地用户帐户,并在年底将其删除。
编辑:对不起,我想象中的使用模拟测试失败的情况下 - 我应该有正确读取你的问题:)我有相似的单元测试,以及他们能够MSTEST中创建本地帐户。 无论这是很好的做法是另一回事。
我看你已经做的这个页面提示:设置应用程序域的主要政策“WindowsPrincipal”。 对我来说,Thread.CurrentPrincipal.Identity.Name给我的用户名和测试通过使用VS 2005和VS 2008打靶.NET 2.0,3.0和3.5。
你在Vista / Win7的运行与UAC和非高架VS? 否则,你能瑞普或者另一台机器上,使用不同的组或您的机器上创建另一个本地管理员帐户和运行测试,这个用户?