gpt4 book ai didi

c# - 将 FakeItEasy 与 Linq 表达式参数一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 10:53:47 32 4
gpt4 key购买 nike

我正在尝试学习如何使用 FakeItEasy,并想尝试将它与我有权访问的旧项目中的一些数据访问代码一起使用。虽然 FIE 的基础知识看起来很​​简单,而且我能够让简单的案例发挥作用,但这个案例让我感到难过。

该系统使用 Entity Framework ,其中一个数据管理类处理用户,我正试图弄清楚如何只测试基本的 GetUserByUserNumber 函数。我可以在实例化 UserDataManager 类时使用伪造的 IPersistenceManager<User>,然后调用 GetUserByUserNumber 方法,但是检查 userPersistenceManager.ReadCustom 是否被调用的断言总是失败。

我已经尝试在伪造的 userPersistenceManager 上调用 Delete 方法,并且断言工作正常。我认为它与 ReadCustom 方法作为其第一个参数的 Linq 表达式有关。我只是不知道应该如何处理。如有任何帮助,我们将不胜感激!

这是我要测试的 UserDataManager 中的方法:

public User GetUserByUserNumber(string userNumber, bool loadRelatedRecords = false)
{
if (string.IsNullOrWhiteSpace(userNumber))
{
throw MyAppExceptions.CreateMyAppFatalException(Constants.ExceptionKeys.Unexpected, new ArgumentNullException("userNumber"));
}
Logger.Write(string.Format("Executing GetUserByUserNumber with UserNumber {0}.", userNumber), LogCategory.General, TraceEventType.Verbose);
return _UserPersistenceManager.ReadCustom(mem => mem.UserNumber == userNumber, EntityConstants.EntityNames.UserDetail);
}

这是我要确保调用的 IPersistenceManager 方法:

TEntity ReadCustom(Expression<Func<TEntity, bool>> predicate, string includeEntityName);

这是我的单元测试:

[TestMethod]
public void GetUserByUserNumber_Calls_ReadCustom()
{
// Arrange
var userPersistenceManager = A.Fake<IPersistenceManager<User>>();
var dataManager = new UserDataManager(userPersistenceManager);

// Act
dataManager.GetUserByUserNumber("123456", false);

// Assert
A.CallTo(() => userPersistenceManager.ReadCustom(u => u.UserNumber == "123456", EntityConstants.EntityNames.UserDetail)).MustHaveHappened();
}

最佳答案

我认为 Tim Long 的回答基本上是正确的,尽管我的倾向并不是说这是模拟框架的失败——它归结为(一般来说,不仅仅是在模拟时)确定两件事是否"is"一样”。

您遇到的问题是,除非另有说明,否则 FakeItEasy 使用 .Equals 来比较参数。 Expression.Equals 相比效果不佳,因此您会得到不匹配。一种选择是探索 Expression 等式检查器。 StackOverflow 上已经有很多关于此的问题,例如 How to check if two Expression<Func<T, bool>> are the same 。如果你能找到一种确定表达式相等性的好方法,我认为你可以将该方法提供给 FakeItEasy 的参数匹配器
(例如使用 A<Expression<Func<TEntity, bool>>.That.Matches(…) )。

或者,你也可以走龙先生的路线,把论点抓下来,等会再审问。我刚刚在回答时提出了类似的方法 How to fake an action<> with FakeItEasy .

在您的情况下,您可以捕获谓词,然后通过查看它如何对各种输入对象使用react来验证其正确性 - 它是否像带有 UserNumber“123456”的对象。

关于c# - 将 FakeItEasy 与 Linq 表达式参数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292711/

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