1

CurrentPrincipal を使用してセキュリティを処理する WPF アプリケーションがあります。これはすべてうまくいきます。

ここで、テスト プロジェクト内からビュー モデル操作を呼び出します。問題は、テストの初期化でアプリケーションの新しいインスタンスを作成するが、このアプリケーションで CurrentPrincipal を設定する方法がわからないことです。

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

アプリケーションの外部から WPF アプリケーションの CurrentPrincipal を設定する方法を知っている人はいますか?

4

1 に答える 1

0

ここで選択する戦略はたくさんありますが、多くの人が採用している戦略の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を提案した理由は、私の好みによるものではなく、ここでの同様のシナリオでこのモックフレームワークを以前に使用したためです)。

于 2012-11-05T22:09:42.397 に答える