c# - 将 Moq 与 Xunit 一起使用 - 单元测试 .net 核心 API
问题描述
我正在尝试对控制器进行单元测试,并创建了一个实现接口的假类。
public class UnitTest1
{
GrantProgramsController _controller;
IBLGrantProgram _grant;
readonly ILogger<GrantProgramsController> _logger;
public UnitTest1()
{
_grant = new BLGrantProgramFake();
_logger = new Logger<GrantProgramsController>(new NullLoggerFactory());
_controller = new GrantProgramsController(_grant, _logger);
}
//tests for get method
[Fact]
public void Get_whencalled_returnsokresult()
{
// Act
var okResult = _controller.GetGrantProgram();
// Assert
Assert.IsType<OkObjectResult>(okResult.Result);
}
----------
但是,我正在尝试使用 Moq 框架并模拟接口,而不是为接口创建假实现。
public UnitTest1()
{
// _grant = new BLGrantProgramFake();
_grant = new Mock<BLGrantProgram>();
_logger = new Logger<GrantProgramsController>(new NullLoggerFactory());
_controller = new GrantProgramsController(_grant, _logger);
}
但是会弹出错误以进行嘲笑。有人可以指出这是否不是方法。我是新手。提前致谢。
解决方案
这可能只是一个分配问题,因为在使用 MOQ 时,实际类型的分配需要来自Mock<T>.Object
属性
public UnitTest1() {
_grant = new Mock<IBLGrantProgram>().Object; //<---
_logger = new Logger<GrantProgramsController>(new NullLoggerFactory());
_controller = new GrantProgramsController(_grant, _logger);
}
如果有要配置的成员,那么Mock<T>
仍然需要设置期望。
例如
public UnitTest1() {
_grant = new Mock<IBLGrantProgram>().Object; //<--- mock assigned
//extract Mock<T> and setup expectations.
Mock.Get(_grant).Setup(_ => _.SomeMember()).Returns(someValue);
_logger = new Logger<GrantProgramsController>(new NullLoggerFactory());
_controller = new GrantProgramsController(_grant, _logger);
}
我建议您参考Moq Quickstart以更好地了解如何使用该库。
推荐阅读
- python-3.x - Python - 实现 numpy.corrcoef
- sql-server - SQL Server 加密函数是否具有确定性?
- google-api - google-calendar-api 的方法 service.events().list 返回超出时间范围的数据
- javascript - 即使在被分配了一个值之后,键也是空的
- r - 使用应用功能时如何添加要排除的条件
- javascript - 无法使用 .exit() .remove() api 删除选定的 D3 SVG 元素
- uwp - UWP 应用程序失败 WACK 并出现多个错误
- php - 提取距离较近的 SPACE 和某个字符之间的子字符串
- react-native - 创建一个可重用的 React Native 模态组件
- azure-data-lake - U-SQL 输出器的提示并行化