[英]Thread.CurrentPrincipal.Identity.Name is empty from WPF
[英]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.