【问题标题】:Setting CurrentPrincipal for a WPF application from within a test从测试中为 WPF 应用程序设置 CurrentPrincipal
【发布时间】:2012-11-05 14:01:48
【问题描述】:

我们有一个使用 CurrentPrincipal 来处理安全性的 WPF 应用程序。这一切都很好。

现在,在测试项目中,我们调用视图模型操作。问题是,在初始化测试时,我们创建了一个新的应用程序实例,但我们不知道如何在这个应用程序上设置 CurrentPrincipal:

 private void TestInitialize()
 {
      var app = new App();
      // setting Thread.CurrentPrincipal doesn't set app thread it seems
 }

有人知道如何从应用程序外部为 WPF 应用程序设置 CurrentPrincipal 吗?

【问题讨论】:

  • 你不能为 RunAs 创建一个脚本吗?这就是我手动测试的方式。

标签: c# wpf security principal


【解决方案1】:

这里有许多不同的策略可供选择,但许多人采用的一种策略是模拟 IPrincipal 和 IIdentity 对象,以模拟当前线程的主体和身份。接下来,我将展示如何使用 Mocking 框架 Moq 完成此操作:

using System.Security.Principal;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace MockingIdentitySample.Test
{
 [TestClass]
 public class UnitTest1
{

    [TestInitialize]
    public void TestInitialize()
    {
        SetupMockedPrincipalAndIdentity(true, true, "John Doe"); 
    }

    private void SetupMockedPrincipalAndIdentity(bool autoSetPrincipal, bool isAuthenticated, string identityName)
    {
        var mockedPrincipal = new Mock<IPrincipal>();
        var mockedIdentity = new Mock<IIdentity>();
        mockedIdentity.Setup(m => m.Name).Returns(identityName);
        mockedIdentity.Setup(m => m.IsAuthenticated).Returns(isAuthenticated); 
        mockedPrincipal.Setup(p => p.Identity).Returns(mockedIdentity.Object);

        if (autoSetPrincipal)
         Thread.CurrentPrincipal = mockedPrincipal.Object;
    }

    [TestMethod]
    public void TestMethod1()
    {
        Assert.AreEqual(Thread.CurrentPrincipal.Identity.Name, "John Doe");
        Assert.IsTrue(Thread.CurrentPrincipal.Identity.IsAuthenticated); 
    }

   }
  }

注意 Thread.CurrentPrincipal 可以直接设置,但是在编写单元测试时,一般强烈建议使用模拟框架或隔离框架。通常我们不是在测试安全代码,而是在代码中为视图模型或类似类编写单元测试,因此我们抽象、隔离或模拟这些依赖关系,例如线程上的当前主体,这样我们就可以专注于我们真正想要的东西为我们的代码逻辑编写单元测试。

当然,必须选择 mocking 是否是正确的选择,或者 Moq 是否是正确使用的框架。在模拟方面有几种选择。 Moq 是一个非常好的模拟框架,但不能模拟例如静态方法。其他模拟框架提供比 Moq 等更多的功能。

如果这似乎是一种可行的方法,可以在此处获得最小起订量的快速入门:

http://code.google.com/p/moq/wiki/QuickStart

(请注意,我是一名独立开发人员,我建议 Moq 的原因不是因为我的喜好,而是因为我之前已经使用过这个模拟框架来处理与您在这里类似的场景)。

【讨论】:

  • 这对你有用吗?正如我在第一篇文章中解释的那样,我尝试在测试中设置主体,但在应用程序代码中主体仍然为空。
  • 您能提供更多信息吗?这对我也不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多