我用的是Sonarqube和sonarqube-8.5.1.38104
这是我的总体结果


KeyValueByClientAndCampaignAsync代码段的结果

守则:
/// <summary>
/// Metodo encargado de consultar los registros en formato de diccionario
/// </summary>
/// <param name="idClient">Id de cliente a consultar</param>
/// <param name="idCampaign">Id de campaña a consultar</param>
/// <returns>System.Threading.Tasks.Task que representa la operación asincrónica, con la información de los registros</returns>
public async Task<Dictionary<decimal, string>> KeyValueByClientAndCampaignAsync(decimal idClient, decimal idCampaign)
{
// Consultamos la memoria a partir del estado
var data = await this.memory.KeyValueAsync<AttachmentDto, decimal, string>(x => x.IdClient, idClient, x => x.Id, x => x.Name, x => x.IdClient == idClient && x.IdCampaign == idCampaign && x.State);
// Validamos si se enontraron registros
if (!data.Any())
// Consultamos la base transaccional
data = await this.repository.Search<Entities.Attachment>(x => x.IdClient == idClient && x.IdCampaign == idCampaign && x.State).ToDictionaryAsync(x => x.Id, x => x.Name);
// Retornamos la información
return data;
}测试片段代码:
/// <summary>
/// Valida que se obtenga la información de la cache y que se retorne los mismos registros
/// </summary>
[Fact]
public async Task KeyValueByClientAndCampaignAsync_Overloaded_Memory_ReturnSameEntities()
{
var isInvokedKeyValueMemory = false;
// Arrange
var memoryJson = base.GetMemory(x =>
{
x.Setup(o => o.KeyValueAsync(It.IsAny<Expression<Func<AttachmentDto, object>>>(), It.IsAny<object>(), It.IsAny<Func<AttachmentDto, decimal>>(), It.IsAny<Func<AttachmentDto, string>>(), It.IsAny<Expression<Func<AttachmentDto, bool>>>()))
.ReturnsAsync(AttachmentFake.KeyValueEntities)
.Callback(() => isInvokedKeyValueMemory = true);
});
var logic = new AttachmentLogic(base.GetRepository<IAttachmentRepository>(),
base.mapper,
memoryJson);
// Act
var dictionary = await logic.KeyValueByClientAndCampaignAsync(1, 1);
// Assert
Assert.NotEmpty(dictionary);
Assert.Equal(AttachmentFake.KeyValueEntities, dictionary);
Assert.True(isInvokedKeyValueMemory);
}
/// <summary>
/// Valida que se obtenga la información de los repositorios y que se retorne los mismos registros
/// </summary>
[Fact]
public Task KeyValueByClientAndCampaignAsync_Overloaded_Repository_ReturnSameEntities() => base.ProcessInMemory<IAttachmentRepository>(async (repository, context) =>
{
// Arrange
await repository.CreateRangeAsync(AttachmentFake.Attachments);
var memoryJson = base.GetMemory(x =>
{
x.Setup(o => o.KeyValueAsync(It.IsAny<Expression<Func<AttachmentDto, object>>>(), It.IsAny<object>(), It.IsAny<Func<AttachmentDto, decimal>>(), It.IsAny<Func<AttachmentDto, string>>(), It.IsAny<Expression<Func<AttachmentDto, bool>>>()))
.ReturnsAsync(new Dictionary<decimal, string>());
});
var logic = new AttachmentLogic(repository,
base.mapper,
memoryJson);
// Act
var result = await logic.KeyValueByClientAndCampaignAsync(1, 1);
// Assert
Assert.NotEmpty(result);
Assert.Equal(AttachmentFake.KeyValueEntitiesTrue, result);
});GetByClientAndCampaignAsync代码段的2.结果

守则:
/// <summary>
/// Metodo encargado de consultar los registros por cliente, campaña y tipo de plantilla
/// </summary>
/// <param name="idClient">Id de cliente a consultar</param>
/// <param name="idCampaign">Id de campaña a consultar</param>
/// <exception cref="ArgumentException">Se genera cuando el id especificado no es valido.</exception>
/// <returns>System.Threading.Tasks.Task que representa la operación asincrónica, con la información del registro especificado</returns>
public async Task<List<AttachmentDto>> GetByClientAndCampaignAsync(decimal idClient, decimal idCampaign)
{
// Buscamos el listado de plantillas en la cache
var entities = await this.memory.FindAllAsync<AttachmentDto>(x => x.IdClient, idClient, x => x.IdClient == idClient && x.IdCampaign == idCampaign);
// Validamos si se encontraron registros
if (!entities.Any())
{
// Buscamos los registros en la base transaccional
var result = await this.repository.Search<Entities.Attachment>(x => x.IdClient == idClient && x.IdCampaign == idCampaign).ToListAsync();
// Convertimos la información
entities = this.mapper.Map<List<AttachmentDto>>(result);
}
// Retornamos la información
return entities;
}测试片段代码:
/// <summary>
/// Valida que se obtenga la información de la caché y que se retorne los mismos registros
/// </summary>
[Theory]
[MemberData(nameof(AttachmentFake.ListAttachmentsCustom), MemberType = typeof(AttachmentFake))]
public Task GetByClientAndCampaignAsync_Memory_ReturnSameEntities(decimal idClient, decimal idCampaign, List<Entities.Attachment> data) => base.ProcessInMemory<IAttachmentRepository>(async (repository, context) =>
{
// Arrange
await repository.CreateRangeAsync(data);
var memoryJson = base.GetMemory(o =>
{
o.Setup(x => x.FindAllAsync(
It.IsAny<Expression<Func<AttachmentDto, object>>>(),
It.IsAny<object>(),
It.IsAny<Expression<Func<AttachmentDto, bool>>>()
))
.ReturnsAsync(base.mapper.Map<List<AttachmentDto>>(data));
});
var logic = new AttachmentLogic(repository,
base.mapper,
memoryJson);
// Act
var result = await logic.GetByClientAndCampaignAsync(idClient, idCampaign);
// Assert
Assert.Equal(data.Count, result.Count);
});
/// <summary>
/// Valida que se obtenga la información de los repositorios y que se retorne los mismos registros
/// </summary>
[Theory]
[MemberData(nameof(AttachmentFake.ListAttachmentsCustom), MemberType = typeof(AttachmentFake))]
public Task GetByClientAndCampaignAsync_Repository_ReturnSameEntities(decimal idClient, decimal idCampaign, List<Entities.Attachment> data) => base.ProcessInMemory<IAttachmentRepository>(async (repository, context) =>
{
// Arrange
await repository.CreateRangeAsync(data);
var memoryJson = base.GetMemory(o =>
{
o.Setup(x => x.FindAllAsync(
It.IsAny<Expression<Func<AttachmentDto, object>>>(),
It.IsAny<object>(),
It.IsAny<Expression<Func<AttachmentDto, bool>>>()
))
.ReturnsAsync(new List<AttachmentDto>());
});
var logic = new AttachmentLogic(repository,
base.mapper,
memoryJson);
// Act
var result = await logic.GetByClientAndCampaignAsync(idClient, idCampaign);
// Assert
Assert.Equal(data.Count, result.Count);
});PaginationByClientAndCampaignAsync代码段的3.结果

守则:
/// <summary>
/// Metodo encargado de consultar los registros paginando desde la base de datos
/// </summary>
/// <param name="idClient">Id de cliente a consultar</param>
/// <param name="idCampaign">Id de campaña a consultar</param>
/// <param name="paging">Parametros de la paginación</param>
/// <returns>System.Threading.Tasks.Task que representa la operación asincrónica, con la información de los registros</returns>
public async Task<PagedResult<AttachmentDto>> PaginationByClientAndCampaignAsync(decimal idClient, decimal idCampaign, PagingParameter paging)
{
// Consultamos la información en la transaccional
var result = await this.repository
.Search<Entities.Attachment>(x => x.IdClient == idClient && x.IdCampaign == idCampaign)
.GetPagedAsync(paging.PageNumber, paging.PageSize);
// Convertimos la información
var data = this.mapper.Map<PagedResult<AttachmentDto>>(result);
// Retornamos la información
return data;
}测试片段代码:
/// <summary>
/// Valida que se obtenga la información de los repositorios y que se retorne los mismos registros
/// </summary>
[Fact]
public Task PaginationByClientAndCampaignAsync_Repository_ReturnSameEntities() => base.ProcessInMemory<IAttachmentRepository>(async (repository, context) =>
{
// Arrange
var entities = AttachmentFake.AttachmentsPagination;
var parameter = new PagingParameter()
{
PageNumber = 1,
PageSize = 10
};
var data = new PagedResult<Entities.Attachment>()
{
CurrentPage = 1,
PageCount = 1,
PageSize = 10,
Results = entities,
RowCount = entities.Count
};
await repository.CreateRangeAsync(AttachmentFake.AttachmentsPagination);
var logic = new AttachmentLogic(repository,
base.mapper,
base.GetMemory());
// Act
var result = await logic.PaginationByClientAndCampaignAsync(1, 1, parameter);
// Assert
Assert.NotNull(result);
Assert.Equal(data.FirstRowOnPage, result.FirstRowOnPage);
Assert.Equal(data.LastRowOnPage, result.LastRowOnPage);
Assert.Equal(data.PageCount, result.PageCount);
Assert.Equal(data.PageSize, result.PageSize);
Assert.Equal(data.Results.Count, result.Results.Count);
Assert.Equal(data.RowCount, result.RowCount);
});如您所见,这三段代码(以及它们的测试)非常相似。
我试图解决这些问题,但我仍然有问题,因为我的管道没有通过由于质量门(我没有控制)。
如果你能给我一个线索,为了解决这个问题,我会非常感激的。
如何构建这些测试?
你会做什么改变?
非常感谢。
发布于 2021-10-13 09:31:35
对于.NET项目,必须在构建过程中生成测试结果报告。结果是XML格式的,必须存储在SonarQube将读取它并将其包含在其报告中的某个位置。
运行单元测试并将结果保存在"NUnitResults.xml"文件中
packages\NUnit.ConsoleRunner.3.7.0\tools\nunit3-console.exe --result=NUnitResults.xml "NUnitTestProject1\bin\Debug\NUnitTestProject1.dll"导入单元测试结果
要导入测试执行报告,在开始步骤中,您需要传递一个指向将要生成的文件的参数:
sonar.cs.nunit.reportsPaths for NUnit完整的命令将类似于:
dotnet sonarscanner begin /k:PROJECT_NAME /d:sonar.login=LOGIN_TOKEN /d:sonar.host.url=URL /d:sonar.cs.nunit.reportsPath=PATH_TO_NUnitResults.xml https://stackoverflow.com/questions/69421034
复制相似问题