gpt4 book ai didi

c# - 如果我对模拟对象设置期望,它会在我正在测试的方法调用的私有(private)方法中使用吗?

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:24 25 4
gpt4 key购买 nike

方法:

public void MethodToTest()
{
//Do something
var result = PrivateMethod();
}

private UserProfile PrivateMethod(RegisterModel model)
{
return _unitOfWork.Repository<UserProfile>().GetSingle(u => u.UserName == model.UserName);
}

测试:

public void Test()
{
var registerModel = new RegisterModel
{
UserName = "admin",
Password = "123456",
}

var userProfile = new UserProfile
{
UserId = 1,
UserName = "admin"
};

var unitMock = new Mock<IUnitOfWork>();
unitMock.Setup(x => x.Repository<UserProfile>().GetSingle(u => u.UserName == registerModel.UserName)).Returns(userProfile);

//Do the rest of the test
}

此处未显示,但 Unit of Work 已注入(inject)构造函数,因此可以模拟 _unitOfWorkUnit of Work 在私有(private)方法中使用的事实是否意味着它仍然会访问数据库,即使我模拟了对象并期望方法和返回值?如果是这样,我该如何避免这种情况?我读到我应该将我的私有(private)方法提取到一个单独的类中,但它已经使用工作单元进行了抽象。

最佳答案

解决您的问题

改变

unitMock.Setup(x => x.Repository<UserProfile>().GetSingle(u => u.UserName == registerModel.UserName)).Returns(userProfile);

unitMock.Setup(x => x.Repository<UserProfile>().GetSingle(It.IsAny<Func<UserProfile,bool>>())).Returns(userProfile);

您提供给 Moq 的 lambda 表达式在逻辑上可能等同于您在生产代码中使用的表达式,但它在引用上并不等同。这意味着您的 GetSingle正在调用方法,但 Mock 中的 lambda 表达式不是 .Equals() ==到被测单元中调用的表达式,因此永远不会调用在您的 Moq 上设置的函数。由于默认情况下 Moq stub 方法,您的私有(private)方法返回 null 因为 .GetSingle(Func<T,bool>)返回 null,因为它被 Moq stub 。

为什么会这样

您可以通过在 C# REPL 中编写以下代码来查看实际情况:

Func<bool> func1 = () => true;
Func<bool> func2 = () => true;
Console.WriteLine(func1 == func2);
// > False
Console.WriteLine(func1.Equals(func2));
// > False

我可以放心地假设您正在设置您的 _unitOfWork正确,否则你会得到 NullReferenceException ,而不是您的方法由于方法链接而返回 null。

代码设计

您可以通过添加 GetProfileByUsername(string) 来解决这个问题方法到您的存储库,而不是允许将 lambda 参数传递给方法。现在您的代码也耦合得很差,所以我建议采用这种方法。 UnitOfWork.Repository<UserProfile>().GetSingle(..)违反得墨忒耳法则。此外,您的类(class)依赖于您的 IRepository<UserProfile> ,并且依赖于您的 UnitOfWork .所以,真的,你应该 mock IRepository<UserProfile>而不是 UnitOfWork并将 that Mock 传递给类。如果不是这种情况,那么很可能是您的被测单元承担了太多责任,并且违反了 SRP 以及和 LoD :)

关于c# - 如果我对模拟对象设置期望,它会在我正在测试的方法调用的私有(private)方法中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25687570/

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