[英]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.