2009-11-24 30 views

回答

0

虽然我不知道它是什么(我不这么认为),但您应该认真考虑您的代码是否可以推广到与接口对接,而不是依赖当前的WindowsIdentity。

这使得您的代码变得更加灵活,并且使得单元测试更简单,因为您可以将任何IPrincipal实现(例如GenericPrincipal)分配给Thread.CurrentPrincipal。只要记住在每个测试用例之后进行适当的Fixture Teardown。这是我们从测试套件的一个典型的例子:

[TestClass] 
public class AuditServiceTest 
{ 
    private IPrincipal originalPrincipal; 

    public AuditServiceTest() 
    { 
     this.originalPrincipal = Thread.CurrentPrincipal; 
    } 

    [TestCleanup] 
    public void TeardownFixture() 
    { 
     Thread.CurrentPrincipal = this.originalPrincipal; 
    } 

    [TestMethod] 
    public void SomeTest() 
    { 
     Thread.CurrentPrincipal = 
      new GenericPrincipal(
       new GenericIdentity("Jane Doe", null)); 
     // More test code 
    } 
} 

这就是说,存在假冒的“单位”测试可能会被担保的情况。我在MSTest中看到的这种做法是通过在测试用例中编写显式模拟代码。

+0

嗨,马克 - 尼斯回应! 对于我的特殊场景,我正在做一个Intranet站点,我在IE中使用Kerberos身份验证,并且ASP.Net使用模拟代表用户代表用户访问SQL。所以我不认为通用原则适用于我的情况。 – 2009-11-25 15:46:03

+0

没错 - 这就是为什么我把这个小小的警告写在最后:) – 2009-11-25 16:09:05

0

看起来团队测试看起来不像这样。我最终编写了我的单元测试以模拟用于调用LogonUser Win32 API的用户using this包装。

现在我的单元测试,像这样:

[TestMethod] 
public void Assert_Access_Denied() 
{ 
    bool denied = false; 

    using (new Impersonator("SomeValidUserWithNoAccess", "SomeTestDomain", "SomeTestPassword")) 
    {     
     try 
     { 
      // access some method that performs windows auth 
     } 
     catch (UnauthorizedAccessException exc) 
     { 
      denied = true; 
     } 
    } 

    Assert.IsTrue(denied); 
} 
相关问题