首页 > 解决方案 > 将 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);
          
        }

但是会弹出错误以进行嘲笑。有人可以指出这是否不是方法。我是新手。提前致谢。

标签: c#unit-testingmoqxunit

解决方案


这可能只是一个分配问题,因为在使用 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以更好地了解如何使用该库。


推荐阅读