ここで選択する戦略はたくさんありますが、多くの人が採用している戦略の1つは、現在のスレッドのプリンシパルとIDをシミュレートするために必要なIPrincipalオブジェクトとIIdentityオブジェクトをモックすることです。次に、モックフレームワーク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を提案した理由は、私の好みによるものではなく、ここでの同様のシナリオでこのモックフレームワークを以前に使用したためです)。