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

时间:2019-09-18 14:49:48

标签: c# .net-core xunit

我目前正在为我的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令牌。

1 个答案:

答案 0 :(得分:1)

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

这是您必须指定操作的参数并自行调用方法的原因,而不是为HttpRequestMessage对象提供正确的网址。