c# – 使用Microsoft Fakes进行模拟
作者:互联网
我已经使用需要模拟的异步(.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;})).
标签:c,net,async-await,microsoft-fakes 来源: https://codeday.me/bug/20190715/1468251.html