我目前正在为我的 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] 删除。
我来说两句