【发布时间】: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<CancellationToken>())的事情? -
@mtkachenko 感谢帮助它解决了我的问题
-
@harshamullangi 很高兴听到!然后将我的答案标记为正确。
标签: c# unit-testing asp.net-core moq xunit