【问题标题】:How to mock database connection in .net core如何在.net核心中模拟数据库连接
【发布时间】:2019-09-19 10:41:48
【问题描述】:

我需要模拟数据库连接,然后调用一个方法返回值。

我创建了起订量数据,但我不确定如何模拟数据库连接。

private void SetupUserRepository()
{
    var firstname = "FirstName1";
    var _lastName = "LastName1";
    var _userName = "FirstName1.LastName1@warburgpincus.com";
    var _email = "FirstName1.LastName1@warburgpincus.com";
    var User = new User { FirstName = firstname, LastName = _lastName, Username = _userName,Email = _email};
   var mockUserRepository = new Mock<IUserRepository>();
       // mockUserRepository.Setup(m => m.GetOne(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync((string section, CancellationToken token) => moqData.contentControls.FirstOrDefault(a => a.InternalControlName == section));
   // mockUserRepository.Setup(m => m.GetOne(It.IsAny<string>(), It.IsAny<CancellationToken>()));
    //var x = moqData.userDetails.First(a => a.Username == _userName);
    mockUserRepository.Setup(m => m.GetOne(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync(moqData.userDetails.First(a => a.Username == _userName));
    UserRepository test = new UserRepository(mockUserRepository.Object,null,null);
    var result = test.GetOne(_userName, It.IsAny<CancellationToken>());
    ///var repo = new UserRepository(mockUserRepository.Object,null,null);
    //var actual = await repo.GetOne(_userName, It.IsAny<CancellationToken>());
    Assert.Same(User, result);
}

而在控制器类下面是需要的参数

public UserRepository(ValuationsReportingContext context, IHttpContextAccessor httpContextAccessor, ILogger<UserRepository> logger) : base(context, httpContextAccessor)
{
    _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    claimsPrincipal = httpContextAccessor?.HttpContext?.User;
}

需要从列表而不是数据库中获取数据

UserRepository test = new UserRepository(mockUserRepository.Object,null,null);

此行正在引发错误,因为它需要一个 dbcontext。

【问题讨论】:

  • 您正在尝试做的是模拟数据库上下文,但您实际上正在做的是创建您的 UserRepository 的模拟并尝试将其注入您的实际 UserRepository。您不能模拟数据库。从技术上讲,在单元测试中,您不希望这样做,因为它是外部依赖项。相反,您应该创建一个模拟用户存储库并调用它来获取您即将执行的数据,但这会使您的上述测试相当无用,因为它所要测试的只是 Moq 框架执行您告诉它执行的操作的能力。它不会测试您的代码。
  • @Mike 基本上我需要对连接到数据库的 1 个方法进行单元测试。那么什么是最好的选择,在我的单元测试中我不想连接到数据库
  • 你为什么把假的IUserRepository 传递给真正的UserRepository?这对我来说没有意义。为什么你不能做类似var result = mockUserRepository.Object.GetOne(_userName, It.IsAny&lt;CancellationToken&gt;()) 的事情?
  • @mtkachenko 感谢帮助它解决了我的问题
  • @harshamullangi 很高兴听到!然后将我的答案标记为正确。

标签: c# unit-testing asp.net-core moq xunit


【解决方案1】:

您不应该使用UserRepository 的实际实现。而是使用您的 IUserRepository 模拟:

var mockUserRepository = new Mock<IUserRepository>();
...
var result = mockUserRepository.Object.GetOne(_userName, It.IsAny<CancellationToken>());

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2011-03-14
    • 2019-03-01
    相关资源
    最近更新 更多