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

亨宁

我目前正在为我的 REST-API 控制器编写单元测试。我注意到我不需要像预期的那样对测试进行身份验证(JWT 令牌)。但是,如果我通过 Postman 处理 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 管道或调用代码,简单地说,这就是您没有收到授权错误的原因。

这与您必须指定操作的参数并自己调用方法而不是提供具有正确 url 的 HttpRequestMessage 对象的原因相同。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章