有没有人想出一个成功的UserManager
和RoleManager
模拟解决方案?我整天都在撞墙。我要做的就是模拟对象以使用内存中的集合,而不是访问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)上的方法。