【发布时间】:2020-01-07 13:47:40
【问题描述】:
我尝试编写一个基本单元测试类来测试我的 api 控制器。但是,我似乎对 IDisposable 有问题,因为我收到以下错误:
无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。
要测试的 API 方法:
[HttpGet("{id}")]
virtual public async Task<IActionResult> GetById(long id)
{
var type = typeof(TManager);
ConstructorInfo? constructorInfo = type.GetConstructor(new[] { typeof(ApiDbContext), typeof(IMapper) });
if (constructorInfo == null)
return BadRequest();
object classObject = constructorInfo.Invoke(new object[] { dbContext, mapper });
MethodInfo? methodInfo = type.GetMethod("GetByIdDto");
if (methodInfo == null)
return BadRequest();
var task = Task.Run(() => methodInfo.Invoke(classObject, new object[] { id }));
TEntityDTO entity = (TEntityDTO)await task.ConfigureAwait(false);
if (entity == null)
{
return NotFound("Record couldn't be found.");
}
return Ok(entity);
}
带有测试方法的类:
public abstract class BaseControllerUnitTests<TController, TEntity, TEntityDTO> : IDisposable where TController : class
{
protected IMapper Mapper { get; set; }
protected ApiDbContext Context { get; set; }
protected BaseControllerUnitTests()
{
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// dispose managed resources
Context.Dispose();
}
// free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
[Fact]
public async Task TestGetItemIdNotFound()
{
// Arrange
long id = 99;
var type = typeof(TController);
ConstructorInfo constructorInfo = type.GetConstructor(new[] { typeof(ApiDbContext), typeof(IMapper) });
Assert.NotNull(constructorInfo);
object classObject = constructorInfo.Invoke(new object[] { Context, Mapper });
MethodInfo methodInfo = type.GetMethod("GetById");
Assert.NotNull(methodInfo);
// Act
var task = Task.Run(() => methodInfo.Invoke(classObject, new object[] { id }));
var controllerResponse = await task.ConfigureAwait(false);
// Assert
Assert.IsType<NotFoundObjectResult>(controllerResponse);
var objectResponse = controllerResponse as ObjectResult;
Assert.Equal(404, objectResponse.StatusCode);
}
}
【问题讨论】:
标签: c# reflection .net-core xunit