c# – 使用Microsoft Fakes进行模拟
发布时间:2020-12-16 00:08:17 所属栏目:百科 来源:网络整理
导读:我已经使用需要模拟的异步(.net 4.5)方法密封了类.我正在使用Microsoft Fakes,所以他们将“垫片”.以下代码是我需要做的一个例子.它构建但运行时,调用“Login”控制器方法中的“LoginAsync”方法,测试挂起. [TestMethod] public async Task LoginPost_Return
我已经使用需要模拟的异步(.net 4.5)方法密封了类.我正在使用Microsoft Fakes,所以他们将“垫片”.以下代码是我需要做的一个例子.它构建但运行时,调用“Login”控制器方法中的“LoginAsync”方法,测试挂起.
[TestMethod] public async Task LoginPost_Returns() { using (ShimsContext.Create()) { var c = new TestController(); var user=new User(); Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um,u) => new Task<IUser>(() => { return user; }); //call controller method var result = await c.Login(model,returnUrl) as ViewResult; var expectedViewName = "Index"; Assert.IsNotNull(result); Assert.AreEqual(expectedViewName,result.ViewName); } //Controller method public async Task<ActionResult> Login(LoginModel model,string returnUrl) { var user = await UserManager.LoginAsync(model.UserName,model.password); return View(); } 解决方法
不要在异步代码中使用Task构造函数.如果您只需要一个带有返回值的已完成任务,请使用Task.FromResult:
IUser user = new User(); Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um,u) => Task.FromResult(user); 作为附加提示,在单元测试中涵盖这些情况是个好主意: >同步成功(Task.FromResult(user)).>异步成功(Task.Run(()=> user)).>异步错误(Task.Run(()=> {throw new InvalidOperationException(“或what”); return user;})). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |