ユニットテスト(MVC) - 役割の問題
-
15-10-2019 - |
質問
MVCアプリケーションがあり、Pocoオブジェクトと執筆単位テストを使用しています。問題は、すべてのテストがこのコードロールのラインに到達したときに失敗することです。isuserinrole( "someuser"、 "role")。役割の新しいインターフェイスまたはリポジトリを実装する必要がありますか?どうも
解決
コード化されたユニットテストで、役割をmock.isuserinroleの機能をock笑しようとしたときに同じ問題がありました。私の解決策は、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メソッドを呼び出します。インターフェイスがあるため、テストでIroleProviderをock笑できます。ここに示す例は、Rhinoモックを使用することです。
var roleProvider = MockRepository.GenerateStub<IRoleProvider>();
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true);
お役に立てれば。
他のヒント
テストで異なる動作をする役割をチェックするカスタムメソッドを設定することができますが、標準的な方法で動作するコンテキストをテストに設定することを好みます。
プレンシャ/FUNCを使用して軽いラッパーを作成できます。
public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role);
次に、役割の代わりにisuserinrole()を使用します。isuserinrole()。実行時に同じ動作が得られます。ただし、テスト時には関数をオーバーライドして、RoleProviderにアクセスしないようにすることができます。
MyClass.IsUserInRole = role => true;
public staticを持ちたくない場合は、コンストラクターを介して述語を注入し、プライベートリードリーとして保存できます。
class MyClass
{
private readonly Predicate<string> IsUserInRole;
MyClass(Predicate<string> roleChecker) { this.IsUserInRole = roleChecker }
MyClass() : this(role => Roles.IsUserInRole(role)) { }
}
MOQを使用する場合、模擬を返してから戻り値を制御し、呼び出されたメソッドを確認できます。そして、Presticateに送信されたパラメーター値を確認します。
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());