1

カスタムRoleProvider(標準のWebフォーム、MVCなし)を作成し、それをテストしたいと思います。プロバイダー自体は、IIdentityのカスタム実装と統合されます(いくつかのプロパティが追加されています)。

私は現在これを持っています:

var user = new Mock<IPrincipal>();
var identity = new Mock<CustomIdentity>();

user.Setup(ctx => ctx.Identity).Returns(identity.Object);
identity.SetupGet(id => id.IsAuthenticated).Returns(true);
identity.SetupGet(id => id.LoginName).Returns("test");

// IsAuthenticated is the implementation of the IIdentity interface and LoginName 

ただし、VS2008でこのテストを実行すると、次のエラーメッセージが表示されます。

オーバーライドできないメンバーの設定が無効です:id => id.IsAuthenticated

なぜこうなった?そして最も重要なのは、それを解決するために何をする必要があるのでしょうか?

Grz、Kris。

4

2 に答える 2

3

IIdentityをモックするか(CustomIdentityの代わりに-モックする変数がインターフェースで宣言されている場合にのみ可能)、使用する変数を仮想として宣言する必要があります。


仮想としてマークするには、次のようにします。具象クラスCustomIdentityで、次を使用します。

public virtual bool isAuthenticated { get; set; }

それ以外の

public bool isAuthenticated { get; set; }

Moqやその他の無料のモックフレームワークでは、仮想としてマークされていない限り、具象クラスタイプのメンバーやメソッドをモックすることはできません。

最後に、手動でモックを作成できます。CustomIdentityをテストクラスに継承すると、必要に応じて値が返されます。何かのようなもの:

internal class CustomIdentityTestClass : CustomIdentity
{
    public new bool isAuthenticated
    {
        get
        {
            return true;
        }
    }

    public new string LoginName
    {
        get
        {
            return "test";
        }
    }

}

このクラスは、CustomIdentityのモックとして、テストでのみ使用されます。

- 編集

コメントで質問に答えます。

于 2009-07-27T12:36:15.627 に答える
0

インターフェイスIIdentityをモックしているのですか、それともカスタムタイプをモックしているのですか?

より完全なコードスニペットを確認する必要がないので、カスタム実装でIsAuthenticatedが仮想としてマークされていないことに不満があると思います。ただし、これは、インターフェイスではなく、具体的なタイプに対してモックを作成している場合にのみ当てはまります。

于 2009-07-27T12:33:21.837 に答える