c# - MVC 5 异步任务<ActionResult> 索引 View 的单元测试

标签 c# asp.net-mvc unit-testing asp.net-mvc-5

我是单元测试的新手。不确定要对什么进行测试,我继续并在 ClientController 上使用索引 View 开始了一个测试。我在为声明为异步任务的索引 View 编写测试方法时遇到问题。我想要做的是确保此操作返回数据。不确定这个测试有多重要,但我想学习在 MVC 5 中编写测试的方法。似乎在为异步 View 编写测试时遇到问题。

管理服务类

public IQueryable<Client> GetAllClients(bool includeDeleted = false)
    {
        var query = context.Clients.AsQueryable();
        if (!includeDeleted) query = query.Where(c => !c.IsDeleted);
        return query;
    }

客户端 Controller

public ClientController(IApplicationContext appContext, IManagementService adminService, IDomainService domainService)
    {
        this.adminService = adminService;
        this.appContext = appContext;
        this.domainService = domainService;
    }
public async Task<ActionResult> Index()
    {
        var clients = adminService.GetAllClients();
        return View(await clients.ToListAsync());
    }

//测试

[TestMethod]
    public void Index()
    {
        //Arrange
        var mgmtmockContext = new Mock<IManagementService>();
        List<Client> db = new List<Client>();
        db.Add(new Client { ClientId = 1, Name = "Test Client 1" });
        db.Add(new Client { ClientId = 2, Name = "Test Client 2" });
        mgmtmockContext
            .Setup(m => m.GetAllClients(false))
            .Returns(() => { return db.AsQueryable(); });

        //Act
        ClientController controller = new ClientController(null, mgmtmockContext.Object, null);

        var result = controller.Index() as Task<ActionResult>;

        //Assert
        Assert.IsNotNull(result);
    }

创建 Controller 的实例后,我不确定如何将模拟对象传递给 Index() 以便测试此 View 返回的数据。

我想要断言的是 Assert.AreEqual(2, result.Count()) 这样我就可以运行这个测试。

最佳答案

为了从结果中得到列表,你需要做两件事:

  1. 获取任务的实际结果
  2. 从 Action 结果中得到模型

这是你如何做到这一点:

    var result = controller.Index() as Task<ViewResult>;

   // Get the actual result from the task
    var viewresult = result.Result;

    // Get the model from the viewresult and cast it to the correct type 
    // (notice in the first line I changed ActionResult to ViewResult to make sure we can access the model.
    var model = (List<Client>)(viewresult.Model);

    //Assert
    Assert.IsNotNull(result);
    Assert.AreEqual(2, model.Count);

关于c# - MVC 5 异步任务<ActionResult> 索引 View 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352377/

相关文章:

c# - 在 C# 中对单个文件使用 FileSystemWatcher

c# - 在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程

c# - MVC2 c# 表格中的多种形式。一种表单在回发时覆盖其他表单元素

javascript - 如何加载 MVC 局部 View 并保持 Angular JS 正常工作

javascript - 具有依赖关系的单元测试 Angular 服务

c# - 将 VB6 类型转换为 C# 结构

c# - 如何使用 emgucv/opencv/Aforge.Net/Accord.Net 在 50-100 毫秒内实时检测仪表中的指示灯和状态(ON-OFF、颜色、闪烁)

asp.net-mvc - ASP.Net MVC - 使用外部 URL 进行表单例份验证

java - 如何编写一个junit测试来在操作之间插入双向链表?

javascript - 使用子组件发出的 Jest : custom event handled by parent, 测试 Vue