2009-07-27 14 views
1

私はカスタムRoleProvider(標準webforms、mvcなし)を作成しました。私はそれをテストしたいと思います。プロバイダ自体はIIdentityのカスタム実装(一部のプロパティが追加されています)と統合されています。Moq custom IIdentity

私は、現時点ではこれを持っている:非オーバーライドメンバーに

無効なセットアップ:私はVS2008でこのテストを実行すると

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 

は、しかし、私は、次のエラーメッセージが表示されますID => id.IsAuthenticated

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

Grz、Kris。

答えて

3

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


、仮想としてマークし、これを行うには:あなたの具象クラスCustomIdentityでは、部品番号およびその他の無料モックフレームワークにはない代わりに

public bool isAuthenticated { get; set; } 

public virtual bool isAuthenticated { get; set; } 

を使用バーチャルにマークされていない限り、具体的なクラスタイプのメンバーやメソッドをモックさせることができます。

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

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

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

} 

このクラスは、あなたのCustomIdentityのモックとして、テストで使用されるだろう。

--EDIT

コメントの質問に答える。

+0

使用した変数を仮想として宣言するとどういう意味ですか?あなたは私のテスト自体を意味しますか? – XIII

+0

@ XIII説明を追加しました。説明は具体的なクラス –

+0

Thxで行ってください。しかし、カスタムIIdentity実装のコードにアクセスすることはできません。回避策はありますか? – XIII

0

あなたはインターフェイスIIdentityを嘲笑していますか、あなたのカスタムタイプを嘲笑していますか?

完全なコードスニペットを見ることなく、IsAuthenticatedがカスタム実装で仮想としてマークされていないと不平を言っていると推測しています。しかし、これはインタフェースではなく具体的​​な型を嘲笑している場合にのみ当てはまります。

+0

これは、アセンブリとして配信された別のチームからのIIdentityのカスタム実装であるため、私は実際に具体的なクラスを嘲笑しています。 IsAuthenticatedプロパティは仮想ではなく(LoginNameプロパティも同じではありません)。 – XIII

+0

ok - 具体的なクラスで仮想としてIsAuthenticatedをマークする必要があります。これで問題は解決するはずです。 –

+0

以下の返信を読んで、これをバーチャルとしてマークするオプションがないようです。この場合、自分自身の*ラッパークラスを "unmockable"クラスの周りに置いて、あなたのコードでこれを使うことを検討したいかもしれません。これで、ラッパーがモック可能であることを確認できます。数日前の私からの投稿を参照してください:http://stackoverflow.com/questions/1182338/1182430#1182430 –