如何进行OData控制器单元测试

如何解决如何进行OData控制器单元测试

我已经使用代码生成器工具来生成Odata Controller(https://efg.loresoft.com/)实体框架核心数据库的第一模型生成

我的api项目中安装的软件包

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <packagereference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.0.1" />
    <packagereference Include="FluentValidation.AspNetCore" Version="9.2.0" />
    <packagereference Include="IdentityServer4.AccesstokenValidation" Version="3.0.1" />
    <packagereference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.8" />
    <packagereference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
    <packagereference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.8" />
    <packagereference Include="Microsoft.AspNetCore.OData" Version="7.5.0" />
    <packagereference Include="scrutor" Version="3.2.2" />
    <packagereference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
  </ItemGroup>
  <PropertyGroup>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <Nowarn>$(Nowarn);1591</Nowarn>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\Park.Core\Park.Core.csproj" />
  </ItemGroup>


</Project>

我们编写了Controller基础类

public class ODataControllerBase<TEntity,TReadModel,TCreateModel,TUpdateModel> : ODataController
            where TEntity : class,IHaveIdentifier
            where TReadModel : EntityReadModel
            where TCreateModel : EntityCreateModel
            where TUpdateModel : EntityUpdateModel
        {
            protected ODataControllerBase(ParkContext dataContext,IMapper mapper,IValidator<TCreateModel> createValidator,IValidator<TUpdateModel> updateValidator)
            {
                DataContext = dataContext;
                Mapper = mapper;
                CreateValidator = createValidator;
                UpdateValidator = updateValidator;
            }
    
            protected ParkContext DataContext { get; }
    
            protected IMapper Mapper { get; }
    
            protected IValidator<TCreateModel> CreateValidator { get; }
    
            protected IValidator<TUpdateModel> UpdateValidator { get; }
            [HttpGet]
            [ODaTaroute]
            [ProducesResponseType(StatusCodes.Status200OK)]
            [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
            public IActionResult Get()
            {
                var dbSet = DataContext
                    .Set<TEntity>();
    
                return Ok(dbSet.AsQueryable());
            }
    
            [HttpGet("{key}")]
            [ProducesResponseType(StatusCodes.Status200OK)]
            [EnableQuery(PageSize = 10,AllowedQueryOptions = AllowedQueryOptions.All)]
            public IActionResult Get([FromODataUri]string key)
            {
                var dbSet = DataContext
                    .Set<TEntity>();
    
                return Ok(dbSet.AsQueryable().Where(p=> p.Id == key));
            }
    
            /// <summary>
            /// Support for create
            /// </summary>
            [HttpPost("")]
            [Consumes(MediaTypeNames.Application.Json)]
            [ProducesResponseType(StatusCodes.Status201Created)]
            [EnableQuery(PageSize = 10,AllowedQueryOptions = AllowedQueryOptions.All)]
            public async Task<IActionResult> Post(CancellationToken cancellationToken,[FromBody]TCreateModel createModel)
            {
                var identityName = User?.Identity?.Name;
    
                var date = DateTime.UtcNow;
                createModel.Id = Guid.NewGuid().ToString();
                createModel.CreatedDate = date;
                createModel.CreatedBy = identityName;
                createModel.ModifiedDate = date;
                createModel.ModifiedBy = identityName;
    
                // validate model
                await CreateValidator.ValidateAndThrowAsync(createModel,cancellationToken: cancellationToken);
    
                // create new entity from model
                var entity = Mapper.Map<TEntity>(createModel);
    
                // add to data set,id should be generated
                await DataContext
                    .Set<TEntity>()
                    .AddAsync(entity,cancellationToken);
    
                // save to database
                await DataContext
                    .SaveChangesAsync(cancellationToken);
    
                //return Ok(entity);
                return new ObjectResult(entity) { StatusCode = StatusCodes.Status201Created };
            }

以上是我的基本控制器

我的控制器外观

 public class UsersController : ODataControllerBase<Park.Core.Data.Entities.Users,UsersReadModel,UsersCreateModel,UsersUpdateModel>
    {
        public UsersController(Park.Core.Data.ParkContext dataContext,IValidator<UsersCreateModel> createValidator,IValidator<UsersUpdateModel> updateValidator) : base(dataContext,mapper,createValidator,updateValidator)
        {
        }
    }

我需要对控制器进行单元测试吗? 我们需要如何测试?我是C#中的单元测试和代码覆盖率工具的新手。

任何指针都将不胜感激。

我需要为Nunit和Moq做推荐的单元测试框架

最好的方法是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?