我目前正在为我的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令牌。
答案 0 :(得分:1)
此代码正确。您的测试框架实际上并未运行Mvc管道或调用代码,简而言之,这就是您未获得授权错误的原因。
这是您必须指定操作的参数并自行调用方法的原因,而不是为HttpRequestMessage对象提供正确的网址。