美文网首页ASP.NET Core .NET CoreASP.NET Core见识录
Asp.net Core 中进行单元测试及集成测试

Asp.net Core 中进行单元测试及集成测试

作者: Angeladaddy | 来源:发表于2019-04-11 16:30 被阅读3次

单元测试

  1. 新建 asp.net core web 工程
  2. 新建 xunit 工程,引用 web 工程
  3. 在 xunit 工程中添加包:Microsoft.AspNetCore.All。添加后如果有问题,将 csporj 文件中的 Microsoft.AspNetCore.All 版本号去掉
 <PackageReference Include="Microsoft.AspNetCore.All" /><PackageReference>
  1. 可选择添加 Moq 库 Mock

测试用例:

    public class ControllerTests
    {
        [Fact]
        public void VerifyIndexViewType()
        {
            //var repository = new InMemoryProductRepository();
            //var controller = new HomeController(repository);
            var repository = new Mock<IProductRepository>();
            var controller = new HomeController(repository.Object);
            var result = controller.Index();
            Assert.IsType<ViewResult>(result);
        }
        [Fact]
        public void VerifyListProductCount()
        {
            var repository = new Mock<IProductRepository>();
            repository.Setup(x => x.ListProducts()).Returns(
                 new List<Product>
                    {
                        new Product{Id="a",Name="aaa",Price = 2.5m},
                         new Product{Id="b",Name="bbb",Price = 3.5m}
                    }
                );
            var controller = new HomeController(repository.Object);
            var result = Assert.IsType<ViewResult>(controller.List());
            var model = Assert.IsType<List<Product>>(result.Model);
            Assert.Equal(2, model.Count);
        }
        [Fact]
        public void VerifyValidIdReturnsProperProduct()
        {
            var repository = new Mock<IProductRepository>();
            repository.Setup(
                x =>x
                .GetRepository(It.IsInRange("aaa","bbb",Range.Inclusive))

            ).Returns(new Product { Id = "aaa", Name = "aaa", Price = 2.5m });
            var controller = new HomeController(repository.Object);
            var result = Assert.IsType<ViewResult>(controller.Detail("aaa"));
            var model = Assert.IsType<Product>(result.Model);
            Assert.Equal("aaa", model.Name);
        }
        [Fact]
        public void VerifyInValidIdReturnsProperProduct()
        {
            var repository = new Mock<IProductRepository>();
            repository.Setup(
                x => x
                .GetRepository(It.IsInRange("ccc", "ddd", Range.Inclusive))
            ).Returns((Product)null);
            var controller = new HomeController(repository.Object);
            var result = Assert.IsType<ViewResult>(controller.Detail("ccc"));
            Assert.Null(result.Model);
        }
    }

集成测试 参考

  • 添加 Microsoft.AspNetCore.TestHost
  • 建立 CientProvider 类以方便测试:
    public class ClientProvider:IDisposable
    {
        private TestServer _server;
        public  HttpClient Client { get; private set; }
        public ClientProvider()
        {
            _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
            Client = _server.CreateClient();
        }

        public void Dispose()
        {
            _server?.Dispose();
            Client?.Dispose();
        }
    }

待测试的 Controller:

    [Route("api/[controller]")]
    [ApiController]
    public class EmployeeController : ControllerBase
    {
        List<Employee> employees = new List<Employee>();
        [HttpGet]
        public ActionResult GetAll()
        {
            return Ok(new Employee { Id = 1, Name = "asd" });
        }
        [HttpPost]
        public ActionResult<List<Employee>> Add(Employee employee)
        {
            employees.Add(employee);
            return Ok(employees);
        }
    }

测试类写法:

    public class EmployeeApiIntergrationTests
    {
        [Fact]
        public async Task Test_GetAll()
        {
            using (var client = new ClientProvider().Client)
            {
                var response = await client.GetAsync("/api/employee");
                response.EnsureSuccessStatusCode();
                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            }
        }

    }
        [Fact]
        public async Task Test_GetAll()
        {
            using (var client = new ClientProvider().Client)
            {
                var response = await client.GetAsync("/api/employee");
                response.EnsureSuccessStatusCode();
                response.StatusCode.Should().Be(HttpStatusCode.OK);
            }
        }
  • Post 测试:
        [Fact]
        public async Task Test_Post()
        {
            using (var client = new ClientProvider().Client)
            {
                var employee = new Employee { Id = 2, Name = "abc" };
                var postContent = JsonConvert.SerializeObject(employee);
                var response = await client.PostAsync(
                    "/api/employee",
                     new StringContent(postContent,Encoding.UTF8,"application/json")
                    );
                response.EnsureSuccessStatusCode();
                response.StatusCode.Should().Be(HttpStatusCode.OK);
                var responseContent =await response.Content.ReadAsAsync<List<Employee>>();
                responseContent.Count.Should().Be(1);
            }
        }

测试项目packages:


image.png

相关文章

  • Asp.net Core 中进行单元测试及集成测试

    单元测试 新建 asp.net core web 工程 新建 xunit 工程,引用 web 工程 在 xunit...

  • 测试过程

    一、测试过程简介 单元测试 集成测试 系统测试 二、测试过程单元集成系统及比较 1.单元测试--函数 单元测试时针...

  • 软件测试阶段划分

    测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试及验收测试。 • 开始是单元测试,集中对用源代码实...

  • 《徐昊-TDD项目实战70讲》学习笔记 -- Day 7

    07|TDD中的测试(3):集成测试还是单元测试? 集成测试还是单元测试? TDD 中的单元测试 在 TDD 的语...

  • 测试定义

    单元测试:单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程。 集成测试:集成测试是...

  • 软件测试的分类(一)

    按测试阶段来分类 单元测试,集成测试,系统测试,验收测试 单元测试1.什么是单元测试?对软件中的进行检查和验证。 ...

  • 软件测试的分类

    软件测试的分类 按测试阶段来分类 单元测试,集成测试,系统测试,验收测试 单元测试:队软件中的最小可测试单元进行检...

  • 测试种类(按项目流程阶段划分)

    单元测试:单元测试是对软件中的基本组成单位进行的测试。目的是检验软件基本组成单位的正确性。 集成测试:集成测试是在...

  • gRPC中集成asp.net identity实现oAuth认证

    gRPC中集成asp.net identity实现oAuth认证 在asp.net core 3.0中开启iden...

  • Day19 - Flutter - 测试用例

    概述 单元测试 Widget测试 集成测试 一、单元测试 单元测试是针对一个函数或者类进行测试 1.1、添加测试依...

网友评论

    本文标题:Asp.net Core 中进行单元测试及集成测试

    本文链接:https://www.haomeiwen.com/subject/mnfxwqtx.html