【发布时间】: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<ILogger<AuthenticationController>>();= 的整个右侧还有红线。
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<ILogger<AuthenticationController>>时,错误说明了什么?据我所知,这应该有效。 -
你得到什么错误(红线)?从我的角度来看,
Substitute.For<ILogger<AuthenticationController>>();应该可以工作。 -
您可能使用了错误的 ILogger。检查您的命名空间是否匹配。
-
@MikeZboray 我已经更新了我的问题
标签: c# unit-testing mocking nsubstitute