将 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 以更好地了解如何使用该库。