将 Moq 与 Xunit 结合使用 - 单元测试 .net 核心 API
Using Moq with Xunit - Unit testing .net core API
我正在尝试对控制器进行单元测试,我创建了一个实现接口的假 class。
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);
}
但是模拟时弹出错误。有人可以指出是否不是这样。我对此很陌生。提前致谢。
这可能只是一个赋值问题,因为在使用最小起订量时,实际类型的赋值需要来自 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 以更好地了解如何使用该库。
我正在尝试对控制器进行单元测试,我创建了一个实现接口的假 class。
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);
}
但是模拟时弹出错误。有人可以指出是否不是这样。我对此很陌生。提前致谢。
这可能只是一个赋值问题,因为在使用最小起订量时,实际类型的赋值需要来自 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 以更好地了解如何使用该库。