簡體   English   中英

在測試中為WPF應用程序設置CurrentPrincipal

[英]Setting CurrentPrincipal for a WPF application from within a test

我們有一個使用CurrentPrincipal來處理安全性的WPF應用程序。 這一切都很好。

現在,在測試項目中,我們稱為視圖模型操作。 問題是,在測試的初始化中,我們創建了應用程序的新實例,但是我們不知道如何在此應用程序上設置CurrentPrincipal:

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

有誰知道如何從應用程序外部為WPF應用程序設置CurrentPrincipal?

這里有許多不同的策略可供選擇,但是許多采用的一種策略是模擬必要的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,但是在編寫單元測試時,強烈建議通常使用模擬框架或隔離框架。 通常,我們不是在測試安全代碼,而是在代碼中為視圖模型或類似類編寫單元測試,因此,我們對這些依賴項(例如線程上的當前主體)進行了抽象,隔離或模擬,因此我們可以專注於真正想要的東西為-編寫代碼的邏輯編寫單元測試。

當然,這里必須選擇模擬是正確的選擇,還是Moq是要使用的正確框架。 關於模擬,有幾種選擇。 Moq是一個非常好的模擬框架,但是不能模擬靜態方法。 其他模擬框架比Moq等提供了更多功能。

如果這是一條可行的路線,請在此處提供Moq的快速入門:

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

(請注意,我是一名獨立開發人員,我之所以建議Moq不是因為我喜歡,而是因為我之前在與您類似的場景中使用了該模擬框架)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM