有没有人想出一个成功的UserManagerRoleManager模拟解决方案?我整天都在撞墙。我要做的就是模拟对象以使用内存中的集合,而不是访问Entity Framework数据存储。我搜寻了互联网,并尝试了使用最小起订量的几种不同方法。

我的印象是,新东西更容易测试。我想念什么吗?

最佳答案

另外,您可以模拟IUserStore<TUser>接受作为参数的UserManager接口(interface)。

var userStore = new Mock<IUserStore<ApplicationUser>>();
var userManager = new UserManager(userStore.Object);

就像@Joe Brunscheon在下面的注释中指出的那样,UserManager检测到对其他接口(interface)(如IUserPasswordStore等)的支持。您也可以添加以下内容:
var passwordManager = userStore.As<IUserPasswordStore<ApplicationUser>>()
    .Setup(...).Returns(...);

您不必一次全部删除所有这些,您可以根据被测代码的需要将它们全部删除。实际上,EF用于实现IUserStore的UserStore实现了其他接口(interface),而UserManager会进行内部检测以查看是否实现了这些接口(interface),从而了解是否支持其他功能。幸运的是,moq使您可以使用.As<T>()模拟可以实现许多接口(interface)的代理。

简而言之,Microsoft.AspNet.Identity确实为您提供了在代码中无包装地使用它所需的一切。只要您使用依赖注入(inject)来实例化UserManager,就可以通过模拟其消耗的接口(interface)并通过某种IUserStore<T> moq传递它们来安全地在单元测试中对它进行Moq,该ojit_code moq被扩展为支持UserManager内部检测到的其他接口(interface)上的方法。

09-18 09:29