使用 ASP.net 核心 MVC 应用程序中的列表为 View() 创建单元测试

灵族

我是单元测试的新手。我有一个控制器 -StudentsController具有依赖注入和我的Index()方法:

public class StudentsController : Controller
{
    public readonly UniversityContext _context;//Database
    public StudentsController(UniversityContext context)
    {
        _context = context;    
    }//Constructor with database
    // GET: Students
    public async Task<IActionResult> Index()
    {
        return View(await _context.Students.ToListAsync());
    }
}

接下来我需要编写一个正确的单元测试代码,检查,如果:

1)一个 View() 和我的学生有一个列表

2)与学生的查询不为空。

我读过 Mock 对象,但我不知道如何编写正确的代码。我到目前为止编写的代码:

public class StudentsControllerTests
{
    [Fact]
    public async Task Index_ReturnsAViewResult_WithAListOfStudents()
    {
        var mockRepo = new Mock<UniversityContext>();
        mockRepo.Setup(repo => repo.Students.ToList()).Returns(GetTestStudents());//There i get following error:Expression references a method that does not belong to the mocked object
        var controller = new StudentsController(mockRepo.Object);

        // Act
        var result = controller.Index();

        //// Assert
        var viewResult = Assert.IsType<ViewResult>(result);
        var model = Assert.IsAssignableFrom<IEnumerable<Student>>(
            viewResult.ViewData.Model);
        Assert.NotNull(model);//Second Condition

    }
    public List<Student> GetTestStudents()
    {
        var sessions = new List<Student>();
        sessions.Add(new Student()
        {
            bDate = new DateTime(1994, 7, 2),
            Name = "Test One"
        });
        sessions.Add(new Student()
        {
            bDate = new DateTime(1995, 7, 1),
            Name = "Test Two"
        });
        return sessions;
    }
}

有人可以解释一下,如何更正我的代码?

恩科西

您只需要模拟上下文的成员,在这种情况下是.Students属性。ToList是在属性上调用的扩展方法,不能被最小起订量模拟。

也是.Students一个 DbSet,也需要被模拟。

使用此答案中的测试类:

如何使用 Entity Framework Core 模拟异步存储库

派生了以下通用扩展方法

public static class MockDbSetExtensions {
    public static Mock<DbSet<T>> AsDbSetMock<T>(this IEnumerable<T> list) where T : class {
        IQueryable<T> queryableList = list.AsQueryable();
        Mock<DbSet<T>> dbSetMock = new Mock<DbSet<T>>();
        dbSetMock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(queryableList.Provider);
        dbSetMock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(queryableList.Expression);
        dbSetMock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
        dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());
        return dbSetMock;
    }

    public static Mock<DbSet<T>> ToAsyncDbSetMock<T>(this IEnumerable<T> source)
        where T : class {        
        var data = source.AsQueryable();        
        var mockSet = new Mock<DbSet<T>>();        
        mockSet.As<IAsyncEnumerable<T>>()
            .Setup(m => m.GetEnumerator())
            .Returns(new TestAsyncEnumerator<T>(data.GetEnumerator()));        
        mockSet.As<IQueryable<T>>()
            .Setup(m => m.Provider)
            .Returns(new TestAsyncQueryProvider<T>(data.Provider));        
        mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => data.GetEnumerator());        
        return mockSet;
    }

}

使用上述实用程序,更新

 mockRepo.Setup(repo => repo.Students.ToList()).Returns(GetTestStudents());

var studentsMockedDbSet = GetTestStudents().ToAsyncDbSetMock();
mockRepo.Setup(repo => repo.Students).Returns(studentsMockedDbSet.Object);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用TryUpdateModel时的asp.net核心MVC控制器单元测试

来自分类Dev

Asp.Net Core MVC Web应用程序中的单元测试

来自分类Dev

单元测试ASP.NET MVC5应用

来自分类Dev

使用Mailkit在asp.net核心mvc应用程序中选定的下拉值的NULLReferenceException

来自分类Dev

使用Mailkit在asp.net核心mvc应用程序中选定的下拉值的NULLReferenceException

来自分类Dev

在Asp.NET MVC中对ViewResult进行单元测试

来自分类Dev

如何在ASP.NET MVC多层应用程序中正确进行单元测试?

来自分类Dev

如何在ASP.NET MVC多层应用程序中正确进行单元测试?

来自分类Dev

为什么我无法在Visual Studio ASP.NET MVC解决方案中创建单元测试?

来自分类Dev

IIS中的Asp.Net核心MVC应用程序Windows身份验证

来自分类Dev

如何使用ASP.NET 5(MVC 6)中的Response属性对控制器动作进行单元测试?

来自分类Dev

在.net核心应用程序中自托管HTTP端点而不使用asp.net?

来自分类Dev

ASP.NET MVC 5-仅使用身份的单元测试服务

来自分类Dev

ASP.Net MVC:使用ValidationAttribute和IClientValidatable时如何编写单元测试代码

来自分类Dev

使用Telerik Just Mock Lite进行Asp.NET MVC区域注册路由单元测试

来自分类Dev

ASP.NET核心应用程序的代码覆盖,并在Pester中完成了测试

来自分类Dev

如何在ASP.NET 5 / MVC 6中的单元测试中访问HttpContext

来自分类Dev

在Asp.net单元测试中缺少对System.Web.Mvc的引用?

来自分类Dev

如何在ASP.NET Core MVC中对RazorViewEngineOptions进行单元测试?

来自分类Dev

在Asp.net单元测试中缺少对System.Web.Mvc的引用?

来自分类Dev

Razor和MVC页面的Asp.net核心应用程序问题

来自分类Dev

ASP.NET MVC:单元测试会话变量不变

来自分类Dev

如何使用Ajax在Asp.net核心MVC中刷新数据而无需重新加载页面?

来自分类Dev

ASP.NET MVC核心-多对多关系-创建视图

来自分类Dev

使用Razor View在ASP.Net MVC3中创建自定义布局

来自分类Dev

在ASP.NET核心Web应用程序下的虚拟目录中运行面向.net 4.6.1的MVC Web应用程序。是否可以?

来自分类Dev

Asp.net核心MVC发布参数始终为null

来自分类Dev

尝试为ASP.Net Core 3.1单元测试创建Mock.Of <ControllerContext>()时出错

来自分类Dev

使用Fake来构建和测试ASP.NET 5 / MVC 6应用程序吗?

Related 相关文章

  1. 1

    使用TryUpdateModel时的asp.net核心MVC控制器单元测试

  2. 2

    Asp.Net Core MVC Web应用程序中的单元测试

  3. 3

    单元测试ASP.NET MVC5应用

  4. 4

    使用Mailkit在asp.net核心mvc应用程序中选定的下拉值的NULLReferenceException

  5. 5

    使用Mailkit在asp.net核心mvc应用程序中选定的下拉值的NULLReferenceException

  6. 6

    在Asp.NET MVC中对ViewResult进行单元测试

  7. 7

    如何在ASP.NET MVC多层应用程序中正确进行单元测试?

  8. 8

    如何在ASP.NET MVC多层应用程序中正确进行单元测试?

  9. 9

    为什么我无法在Visual Studio ASP.NET MVC解决方案中创建单元测试?

  10. 10

    IIS中的Asp.Net核心MVC应用程序Windows身份验证

  11. 11

    如何使用ASP.NET 5(MVC 6)中的Response属性对控制器动作进行单元测试?

  12. 12

    在.net核心应用程序中自托管HTTP端点而不使用asp.net?

  13. 13

    ASP.NET MVC 5-仅使用身份的单元测试服务

  14. 14

    ASP.Net MVC:使用ValidationAttribute和IClientValidatable时如何编写单元测试代码

  15. 15

    使用Telerik Just Mock Lite进行Asp.NET MVC区域注册路由单元测试

  16. 16

    ASP.NET核心应用程序的代码覆盖,并在Pester中完成了测试

  17. 17

    如何在ASP.NET 5 / MVC 6中的单元测试中访问HttpContext

  18. 18

    在Asp.net单元测试中缺少对System.Web.Mvc的引用?

  19. 19

    如何在ASP.NET Core MVC中对RazorViewEngineOptions进行单元测试?

  20. 20

    在Asp.net单元测试中缺少对System.Web.Mvc的引用?

  21. 21

    Razor和MVC页面的Asp.net核心应用程序问题

  22. 22

    ASP.NET MVC:单元测试会话变量不变

  23. 23

    如何使用Ajax在Asp.net核心MVC中刷新数据而无需重新加载页面?

  24. 24

    ASP.NET MVC核心-多对多关系-创建视图

  25. 25

    使用Razor View在ASP.Net MVC3中创建自定义布局

  26. 26

    在ASP.NET核心Web应用程序下的虚拟目录中运行面向.net 4.6.1的MVC Web应用程序。是否可以?

  27. 27

    Asp.net核心MVC发布参数始终为null

  28. 28

    尝试为ASP.Net Core 3.1单元测试创建Mock.Of <ControllerContext>()时出错

  29. 29

    使用Fake来构建和测试ASP.NET 5 / MVC 6应用程序吗?

热门标签

归档