gpt4 book ai didi

c# - 大量使用谓词返回数据

转载 作者:行者123 更新时间:2023-11-30 14:45:53 25 4
gpt4 key购买 nike

我正在使用 .Net Core 2 Web API 和一个大量使用谓词的架构,当我尝试使用 Moq 对我的代码进行单元测试时,这会导致一些问题。

我的每个存储库都继承自具有如下基本方法的基本存储库:

public T GetSingle(Expression<Func<T, bool>> predicate)
{
return _context.Set<T>().FirstOrDefault(predicate);
}

public virtual IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate)
{
return _context.Set<T>().Where(predicate);
}

在我的用户 Controller 注册方法中,我想确保我不允许重复的电子邮件,我这样做是这样的:

var emailCheck = _userRepository.GetSingle(x => x.Email == user.Email);
if (emailCheck != null)
{
// duplicate
return StatusCode(StatusCodes.Status409Conflict, "This email is already in use.");
}

在我的单元测试中,我想进行测试以确保我们不允许重复,所以我设置了它:

public void Signup_Fail_DuplicateEmail_Controller_Test()
{
var user = UserHelper.CreateSignupUser();
user.Email = "duplicate@test.com";
var uRepo = new Mock<IUserRepository>();

uRepo.Setup(u => u.GetSingle(x => x.Email == user.Email)).Returns(user);

var uc = new UserController(uRepo.Object);
var result = uc.Signup(user);

var status = Assert.IsType<StatusCodeResult>(result);
Assert.Equal(StatusCodes.Status409Conflict, status.StatusCode);
}

无论我做什么,Setup 方法总是返回 null。现在我在几个地方读到 Moq 不能与 FirstOrDefault 和其他类似的辅助方法一起使用,但我不确定该怎么做,因为我的架构非常依赖谓词。当然想避免修改我的基础存储库,但我需要能够运行这样的测试。

想法?

最佳答案

无法比较表达式,因此模拟将始终返回 null。

如果这只是为了单独测试被测方法的流程,您可以使用 It.IsAny<Expression<Func<T, bool>>>()对于参数匹配器。

public void Signup_Fail_DuplicateEmail_Controller_Test() {
//Arrange
var user = UserHelper.CreateSignupUser();
user.Email = "duplicate@test.com";
var uRepo = new Mock<IUserRepository>();

uRepo
.Setup(_ => _.GetSingle(It.IsAny<Expression<Func<T, bool>>>()))
.Returns(user);

var uc = new UserController(uRepo.Object);

//Act
var result = uc.Signup(user);

//Assert
var status = Assert.IsType<StatusCodeResult>(result);
Assert.Equal(StatusCodes.Status409Conflict, status.StatusCode);
}

引用 Moq Quickstart

上述方法适用于在独立单元测试中测试预期行为。

但是,如果您想测试实际表达式,则可以使用内存中集成测试或实际数据库来完成。

关于c# - 大量使用谓词返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com