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;})).

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...