我有MVC应用程序,并且正在使用POCO对象和写作单元测试。问题是,当我扮演这条代码角色时,我所有的测试都会失败。IsuserInrole(“ someuser”,“角色”)。我应该为角色还是...实现新的接口或存储库?谢谢

有帮助吗?

解决方案

在试图嘲笑角色时,我也遇到了同样的问题。在我的编码单元测试中,异塞林功能。我的解决方案是创建一个名为Roleprovider的新类,并使用Method Iserinrole的接口,然后将其称为System.Web.Security.Roles.isuserinrole:

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

然后,在我的代码中,我称之为Roleprovider Isuserinrole方法。由于您有一个接口,因此您可以在测试中模拟iRoleprovider,以下显示的示例是使用Rhino Mocks:

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

希望这可以帮助。

其他提示

您可以设置一种自定义方法来检查在测试中会有所不同的角色,但是我更喜欢设置测试可以使用标准方法的上下文。

http://stephenwalther.com/blog/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspx

您可以使用谓词/功能创建一个轻型包装器。

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

然后使用iSererinrole()而不是角色。ISERINROLE()。在运行时,您会得到相同的行为。但是在测试时间您可以覆盖该功能,以使其无法访问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());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top