在MVC5中模拟ConfirmEmailAsync和其他UserManager方法的接口MVC项目。[AllowAnonymous]publicasyncTaskConfirmEmail(stringuserId,stringcode){if(userId==null||code==null){returnView("Error");}}varresult=awaitUserManager.ConfirmEmailAsync(userId,code);returnView(result.Succeeded?"ConfirmEmail":"Error");AccountController有一个构造函数,该构造函数将ApplicationUserManager和ApplicationSignInManager作为参数,并且属性匹配用于测试的私有setter。但是,我不知道如何模拟ConfirmEmailAsync方法。您可以在Identity命名空间中模拟各种接口:varstore=newMock();store.As().Setup(x=>x.FindByIdAsync("username1")).ReturnsAsync((ApplicationUser)null);varmockManager=newApplicationUserManager(store.Object);AccountControllerac=newAccountController(mockManager,null,GetMockRepository().Object,GetMockLogger().Object);但我无法找到或弄清楚我需要哪个接口来创建ConfirmEmailAsync的模拟。我应该怎么办?作为参考,是否有一种好方法可以找出这些方法正在使用哪个接口,以便我可以模拟和测试它们?ConfirmEmailAsync当前不是框架中接口的一部分。它位于UserManager类中,这是身份框架的基类。我的解决方案总结我通过将身份的大部分功能抽象到它自己的项目中来解决这个问题,这样我就可以更轻松地对其进行单元测试并在其他项目中重用抽象。阅读本文后,我了解了PersistenceIgnoranceASP.NETIdentitywithSchema,然后我调整了这个想法以满足我的需要。我基本上只是将我需要的一切从asp.net.identity换成我的自定义界面,它或多或少反映了框架提供的内容,但具有更容易模拟的优势。IIdentityUser//////id类型为///的用户的最小接口publicinterfaceIIdentityUser:IIdentityUser{}//////用户的最小接口///publicinterfaceIIdentityUserwhereTKey:System.IEquatable{TKeyID{得到;放;}字符串用户名{得到;放;}字符串电子邮件{得到;放;}boolEmailConfirmed{得到;放;}stringEmailConfirmationToken{得到;放;}stringResetPasswordToken{得到;放;}字符串PasswordHash{得到;放;}}IIdentityManager//////公开用户相关的api,它将自动将更改保存到UserStore///publicinterfaceIIdentityManager:IIdentityManager{}//////公开用户相关的api,它将自动将更改保存到UserStore///publicinterfaceIIdentityManager:IIdentityManagerwhereTUser:class,IIdentityUser{}//////公开用户相关的api,它将自动保存对UserStore的更改///publicinterfaceIIdentityManager:IDisposablewhereTUser:class,IIdentityUserwhereTKey:System.IEquatable{TaskAddPasswordAsync(TKeyuserid,stringpassword);任务ChangePasswordAsync(TKey用户ID,字符串当前密码,字符串新密码);任务ConfirmEmailAsync(TKeyuserId,stringtoken);//。..为简洁起见删除了其他代码}IIdentityResult//////表示身份操作的最小结果///在我的身份管理中,在Manager的默认实现中,我简单地包装了ApplicationManager,然后将结果和函数映射到我的类型和asp.net.identity类型之间公共类DefaultUserManager:IIdentityManager{privateApplicationUserManagerinnerManager;publicDefaultUserManager(){this.innerManager=ApplicationUserManager.Instance;}//..为简洁起见删除了其他代码publicasyncTaskConfirmEmailAsync(stringuserId,stringtoken){返回结果.AsIIdentityResult();}//...为简洁起见删除了其他代码}免责声明:我在做Typemock工作。实际上,如果使用Typemock,则不需要任何接口,只需要伪造所需的IdentityResult并更改异步方法“ConfirmEmailAsync”的行为,例如测试一个检查未确认电子邮件的场景:MVC5模拟ConfirmEmailAsync和其他UserManager方法的接口共享的所有内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——[TestMethod,Isolated]publicasyncTaskTestWhenEmailIsBad_ErrorMessageIsShown(){//Arrange//CreatewantedcontrollerfortestingandfakeIdentityResultvarcontroller=newaspdotNetExample.Controllers.AccountController();varfakeIdentityRes=Isolate.Fake.Instance();//伪造的HttpContext返回一个伪造的ApplicationSignInManagervarfakeSIM=Isolate.WhenCalled(()=>controller.UserManager).ReturnRecursiveFake();//修改ConfirmEmailAsync的行为以返回fakeIdentityResIsolate.WhenCalled(()=>fakeSIM.ConfirmEmailAsync("","")).WillReturn(Task.FromResult(fakeIdentityRes));Isolate.WhenCalled(()=>fakeIdentityRes.Succeeded).WillReturn(false);//Actvarresult=awaitcontroller.ConfirmEmail("","")asViewResult;//断言Assert.AreEqual("Error",result.ViewName);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: