我有一个 TestController 类,我正在其中对 Controller 类执行单元测试。
Controller 类创建一个名为
_service
的 Service 类的实例。 Controller 类有一个方法,其实现如下:
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> Get(CancellationToken ct)
{
try
{
return Ok(await _service.GetAll(ct));
}
catch (Exception e)
{
_logger.LogError(e.Message);
return StatusCode(StatusCodes.Status500InternalServerError, "There was an error processing your request.");
}
}
在我的 TestController 类中,我创建了一个名为
_mockService
的 Service 类的 Moq'ed 实例。 TestController 类中的方法之一使用 _mockService
并将其设置为引发异常,以便我可以在 Controller 类的 catch 块中测试 return 语句:
[Fact]
public async void Get_ReturnsIActionResult_InternalServerError()
{
// Setup mock
CancellationToken ct = default(CancellationToken);
_mockService.Setup(ms => ms.GetAll(ct)).Throws(new TaskCanceledException());
// Test class
var result = await _controller.Get(ct);
// Assert results
var objectResult = Assert.IsType<ObjectResult>(result);
Assert.Equal(500, objectResult.StatusCode);
}
同样,我有一个 TestRepository 类,我在 Repository 类上执行单元测试。
Repository 类创建名为
_dbContext
的 DbContext 类的实例。 Repository 类有一个方法,其实现如下:
public async Task<IEnumerable<SomeDbSetProperty>> GetAll(CancellationToken ct = default)
{
try
{
return await _dbContext.SomeDbSetProperty.Where(p => p.IsActivated == true).ToListAsync(ct);
}
catch (Exception e)
{
_logger.LogError($"Error in GetAll: {e}");
throw;
}
}
我的团队选择使用本文中概述的内存中方法,而不是 Moq'ing DbContext 类(这与我们在 TestController 类中 Moq'ed Service 类的方法类似)。 (我意识到这是一种令人沮丧的做法,但决定不是由我决定的。)
我的目标是在 TestRepository 类中创建一个测试方法,用于测试 Repository 类的 catch 块中的代码(类似于我的 TestController 类中测试 Controller 类中的 catch 块的方法)。
我的问题是我不知道如何使用内存方法来做到这一点。通过使用 Setup 和 Throws 方法可以很容易地完成 Moq,但我不知道如何使用内存方法复制该概念。也许我正在经历为什么他们不推荐内存中方法,或者也许我忽略了一些东西。
如有任何帮助,我们将不胜感激。
在我看来,你有几个选择: