繁体   English   中英

Xunit-有关未经身份验证的单元测试的问题

[英]Xunit - Question about Unit tests without authentication

我目前正在为REST-API控制器编写单元测试。 我注意到我不需要为测试进行身份验证(JWT令牌)。 但是,如果我通过邮递员处理API,那么我会这样做。 这是正确的还是我的控制器有错误?

我的API控制器:

[Authorize]
[ApiController]
[Route("persons")]
public class PersonController : ControllerBase
{
    private readonly API_DB_Context dbContext;
    private readonly IMapper mapper;

    public PersonController(API_DB_Context context, IMapper mapper)
    {
        this.dbContext = context;
        this.mapper = mapper;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> Get(long id)
    {
        PersonManager manager = new PersonManager(dbContext, mapper);
        var myTask = Task.Run(() => manager.GetPersonDTO(id));
        PersonDTO person = await myTask;

        if (person == null)
        {
            return NotFound("The Person record couldn't be found.");
        }

        return Ok(person);
    }
}

我的整合测试:

public class PersonControllerIntegrationTests : IDisposable
{
    private readonly IMapper mapper;
    private readonly API_DB_Context context;

    public PersonControllerIntegrationTests()
    {
        var mockMapper = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new MappingProfiles());
        });
        mapper = mockMapper.CreateMapper();

        var serviceProvider = new ServiceCollection()
        .AddEntityFrameworkSqlServer()
        .BuildServiceProvider();

        var builder = new DbContextOptionsBuilder<API_DB_Context>();

        builder.UseSqlServer($"Server=(local);Database=TestDb_{Guid.NewGuid()};Trusted_Connection=True;MultipleActiveResultSets=true")
                .UseInternalServiceProvider(serviceProvider);

        context = new API_DB_Context(builder.Options);
        context.Database.Migrate();

        context.Person.AddRange(DbPersonDataRepositories.GetTestPerson());
        context.SaveChanges();
    }

    [Theory]
    [InlineData(1, "Testuser")]
    [InlineData(2, "John")]
    public async Task TestGetPersonItem(long personID, string expectedName)
    {
        // Arrange
        PersonController controller = new PersonController(context, mapper);

        // Act
        var controllerResponse = await controller.Get(personID);

        // Assert
        var objectResult = Assert.IsAssignableFrom<ObjectResult>(controllerResponse);
        PersonDTO model = Assert.IsAssignableFrom<PersonDTO>(objectResult.Value);
        Assert.Equal(expectedName, model.lastName);
        Assert.Equal(personID, model.id);
    }

    public void Dispose()
    {
        context.Database.EnsureDeleted();
        context.Dispose();
    }
}

如您所见,我的单元测试不包含任何身份验证代码。 例如,创建JWT令牌。

该代码是正确的。 您的测试框架实际上并未运行Mvc管道或调用代码,简而言之,这就是您未获得授权错误的原因。

这就是为什么必须指定操作的参数并自己调用该方法,而不是为HttpRequestMessage对象提供正确的url的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM