2011-01-04 16 views
4

私はmvcアプリケーションを持っています。私はpocoオブジェクトとユニットテストを作成しています。問題は、すべてのテストが、このコード行Roles.IsUserInRole( "someUser"、 "role")に達すると失敗することです。私はロールまたは新しいインターフェイスまたはリポジトリを実装する必要がありますか? Thxユニットテスト(mvc) - ロールに関する問題

+1

あなたの質問にお答えするには十分な情報がありません。あなたの質問に詳細を追加/追加/追加することを検討してください。 – Kendrick

+0

なぜ失敗するのですか?例外の詳細と使用しているフレームワークを投稿できますか?ほとんどのフレームワークでは、失敗するタイプの例外が使用されるため、テストの分離によって失敗または例外が発生する可能性があります。 – StuperUser

+0

私はコントローラの[unit-testing-security-model-clickonce](http://stackoverflow.com/questions/4585174/unit-testing-security-model-clickonce/4585686#4585686)のようなロールテストを実装しました – k3b

答えて

10

コード化された単体テストでRoles.IsUserInRole機能をモックしようとすると、同じ問題が発生しました。私のソリューションは、RoleProviderと呼ばれる新しいクラス、その後System.Web.Security.Roles.IsUserInRoleと呼ばれる方法のisUserInRoleとのインタフェースを作成することでした。

public class RoleProvider: IRoleProvider 
{ 
    public bool IsUserInRole(IPrincipal userPrincipal) 
    { 
     return System.Web.Security.Roles.IsUserInRole(userPrincipal.Identity.Name, "User"); 
    } 
} 

はその後、私のコードで私はRoleProvider isUserInRoleメソッドを呼び出します。このことができます

var roleProvider = MockRepository.GenerateStub<IRoleProvider>(); 
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true); 

希望:あなたがここに示されているあなたは、あなたのテストでIRoleProviderを模擬することができますインターフェイス、例を持っているとしてRhinoのモックを使用しています。

+0

Thx、これは私のために働いています(: – Cipiripi

+0

これはテスト容易性に非常に優れていますが、私のコントローラにはRoleProviderのインスタンスが必要であると迷惑を掛けていました。プロパティ/フィールド)。ありがとうの提案! – Killnine

0

あなたは述語/ FUNCを有する光ラッパーを作成することができます。

public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role); 

次に、Roles.IsUserInRole()の代わりにIsUserInRole()を使用します。実行時に同じ動作が得られます。あなたが公共の静的な、あなたのコンストラクタを介して述語を注入し、プライベート読み取り専用としてそれを格納することができを持っていないことを好む場合は、RoleProvider

MyClass.IsUserInRole = role => true; 

にアクセスしないように、しかし、テスト時に、あなたは関数をオーバーライドすることができます。

class MyClass 
{  
    private readonly Predicate<string> IsUserInRole; 
    MyClass(Predicate<string> roleChecker) { this.IsUserInRole = roleChecker } 
    MyClass() : this(role => Roles.IsUserInRole(role)) { } 
} 

モックを使用する場合は、モックを返してから戻り値を制御したり、メソッドが呼び出されたことを確認したりできます。そして、どのパラメタ値が述語に送られたのか確認してください。

Mock<Predicate<string>> mockRoleChecker = new Mock<Predicate<string>>(); 
var cut = new MyClass(mockRoleChecker.Object); 
var expectedRole = "Admin"; 
mockRoleChecker.SetReturnsDefault<bool>(true); // if not specified will return false which is default(bool) 

cut.MyMethod(); 

mockRoleChecker.Verify(x => x(expectedRole), Times.Once()); 
関連する問題