c# - 继承类的 Moq 测试总是返回 null
问题描述
我在为实现存储库模式的控制器设置单元测试时遇到问题。我想检查控制器的返回值。在为存储库设置我的 Mock 时,继承的 IRepository 方法总是返回null
. 我期待看到我在.ReturnsAsync("test")
存储库
public interface IRepository
{
Task<T> Get<T>(string storedProcedure, object template);
Task<T> Get<T>(string sql, CommandType commandType, object template);
}
public interface ITARRepository : IRepository
{
// other methods
...
}
控制器
private readonly ITARRepository Repository;
public async Task<IActionResult> GetTARTrackerResponse(long id)
{
try
{
var result = await Repository.Get<string>("spName", new { @Params = id });
return Ok(result);
}
catch (Exception e)
{
// logged
...
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
测试
[Fact]
public async Task Returns_OK_With_Tar_Tracker_Response()
{
//arrange
var mockRepo = new Mock<ITARRepository>();
mockRepo
.Setup(repo => repo.Get<string>("storedproc", new { test = 12345 }))
.ReturnsAsync("test");
var controller = new TARTrackerController(Logger, mockRepo.Object);
//act
var result = await controller.GetTARTrackerResponse(12345);
var ObjectResult = result as ObjectResult;
//assert
Assert.IsType<OkObjectResult>(result);
Assert.IsType<string>(ObjectResult.Value.GetType());
}
解决方案
设置中的参数匹配器与被测主题中实际调用的内容不匹配,因此在执行测试时调用模拟不会按预期运行。
主题正在调用
var result = await Repository.Get<string>("spName", new { @Params = id });
虽然模拟依赖期望
.Setup(repo => repo.Get<string>("storedproc", new { test = 12345 }))
配置模拟以完全匹配预期或使用放松预期匹配It.IsAny<T>()
[Fact]
public async Task Returns_OK_With_Tar_Tracker_Response() {
//arrange
string expected = "test";
var mockRepo = new Mock<ITARRepository>();
mockRepo
.Setup(repo => repo.Get<string>(It.IsAny<string>(), It.IsAny<object>()))
.ReturnsAsync(expected);
var controller = new TARTrackerController(Logger, mockRepo.Object);
//act
var result = await controller.GetTARTrackerResponse(12345);
//assert
OkObjectResult objectResult = Assert.IsType<OkObjectResult>(result);
string actual = Assert.IsType<string>(objectResult.Value);
Assert.Equal(expected, actual);
}
推荐阅读
- powerpoint - 每个 Powerpoint 幻灯片标题中的可编辑 TableOfContents 框
- python - Selenium webdriver 在导航到新域时清除 cookie
- c# - 在 Visual Studio 2012 中,通过引用我的实际项目的测试项目,我可以在不重建核心项目的情况下运行测试吗?
- microsoft-cognitive - 自定义视觉 ONNX 模型不再适用于 Windows 10 ML 2018 年 10 月版本
- javascript - formatText 函数中未定义参数“style”?
- cocoa - 用于持久线程的 NSOperation
- javascript - 在轴上显示动态频率
- python - 为什么我需要在路径转换器中使用 to_url() 方法?姜戈
- python - 如何将自定义函数应用于熊猫数据框的每一列?
- security - Kubernetes - 动态命名空间/安全