【问题标题】:How do I use NSubstitute to mock ILogger on a constructor如何使用 NSubstitute 在构造函数上模拟 ILogger
【发布时间】:2019-01-10 08:58:13
【问题描述】:

我有以下具体的控制器构造函数:

public class AuthenticationController : ControllerBase
{
    private readonly IUserRepository<User> _userRepository;
    private readonly ILogger<AuthenticationController> _logger;
    private readonly IConfiguration _config;


    public AuthenticationController(IUserRepository<User> userRepository, ILogger<AuthenticationController> logger, IConfiguration config)
    {
        _userRepository = userRepository;
        _logger = logger;
        _config = config;
    }

我正在尝试模拟构造函数,但 ILogger 似乎有问题。

 var userRepository = Substitute.For<IUserRepository<User>>();
 var config = Substitute.For<IConfiguration>();
 var logger = Substitute.For<ILogger>();

 var controller = new AuthenticationController(userRepository, logger, config);

使用 logger 我尝试了以下方法,但都继续在 Constructor 下留下“红线”:例如。就行了

var controller = new AuthenticationController(userRepository, logger, config);

无论我尝试什么,AuthenticationController 都有红线。

如果我以以下形式声明记录器: var logger = Substitute.For&lt;ILogger&lt;AuthenticationController&gt;&gt;();= 的整个右侧还有红线。

var logger = Substitute.For<ILogger<AuthenticationController>>();

那我试过了:

var auth = Substitute.For<AuthenticationController>();
var logger = Substitute.For<ILogger<auth>>();

当我将鼠标悬停在红线上时,它提到 api 上的程序集引用高于单元测试程序集。这两个项目都针对 .Net Core 2.1

这是我的测试项目产生的错误:

身份为“My.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的程序集“My.Api”使用“Microsoft.AspNetCore.Mvc.Core, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60',其版本高于引用的程序集 'Microsoft.AspNetCore.Mvc.Core',标识为 'Microsoft.AspNetCore.Mvc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'

我的测试项目引用了我的 api 项目。 api项目有引用Microsoft.AspNetCore.App (2.1.1)我的单元测试项目根本没有直接引用这个库。

【问题讨论】:

  • 好吧,我从来没有使用过Substitute,但在Moq 框架中,您传递对象Mock.Object 或在您的场景中 - logger.Object 而不是模拟本身
  • 当您使用For&lt;ILogger&lt;AuthenticationController&gt;&gt; 时,错误说明了什么?据我所知,这应该有效。
  • 你得到什么错误(红线)?从我的角度来看,Substitute.For&lt;ILogger&lt;AuthenticationController&gt;&gt;(); 应该可以工作。
  • 您可能使用了错误的 ILogger。检查您的命名空间是否匹配。
  • @MikeZboray 我已经更新了我的问题

标签: c# unit-testing mocking nsubstitute


【解决方案1】:

您需要确保您的代码项目和您的单元测试项目使用相同版本的包含 ILogger 的 nuget 包。

【讨论】:

  • 在这两个项目中,如果我右键单击并选择“转到定义”,则会转到同一个文件Assembly Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
  • 这很奇怪。你检查过 NuGet 包管理器吗?
【解决方案2】:

奇怪,我在解决方案中创建了一个新的测试项目,但仍然收到同样的错误。所以,在我原来的测试项目中,我专门通过 Nuget 安装了

Microsoft.AspNetCore.Mvc.Core (2.1.1) 包

我的错误消失了,它运行成功了。我没有在我的 Api 项目中特别提到这一点。我已经提出这个问题,以防其他人遇到类似问题。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2019-11-24
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多