如何对包含 EntityFunctions.AddDays 函数的 GetNewValues() 进行单元测试

2023-12-21

下面的示例代码在生产中运行良好,但不能是单元 因为 EntityFunctions 进行了测试。

我的单元测试项目正在使用 InMemoryDatabase 而不是真正的 SQL 数据库。我可以轻松解决我的问题 通过在 SQL 数据库中使用计算列创建视图来解决问题 myValue 和 newValue。我喜欢找到一种方法来进行单元测试工作 无需更改我的方法,也无需创建新的 SQL 视图


public class EcaseReferralCaseRepository : Repository
{

        public class myType
        {
                public DateTime myValue;
                public DateTime newValue;
        }

        public myType GetNewValues()
        {
                return 
                        (myType)(from o in context.EcaseReferralCases
                        select new myType
                        {
                            // LINQ to Entity
                            myValue = (DateTime)System.Data.Objects.EntityFunctions.AddDays(o.StartDate, 0),
                            newValue = (DateTime)System.Data.Objects.EntityFunctions.AddDays(o.StartDate, 30)

                            // LINQ to Object
                            //myValue = o.StartDate.AddDays(0),
                            //newValue = o.StartDate.AddDays(30)

                        });
        }
}

此链接显示了单元测试 EntityFunctions 的一个很好的示例 https://stackoverflow.com/questions/9585203/entityfunctions-truncatetime-and-unit-tests,我用这种方法解决了我的一个单元测试难题,但不知道如何解决这个问题。


除非我弄错了,否则您将使用另一个来切换 EcaseReferralCases 的实现IQueryable,可能是 LINQ To Objects 可查询源。

最可靠的方法可能是使用表达式访问者来替换对EntityFunctions使用您自己的 L2Objects 兼容函数。

这是我的实现:

using System;
using System.Data.Objects;
using System.Linq;
using System.Linq.Expressions;

static class EntityFunctionsFake
{
    public static DateTime? AddDays(DateTime? original, int? numberOfDays)
    {
        if (!original.HasValue || !numberOfDays.HasValue)
        {
            return null;
        }
        return original.Value.AddDays(numberOfDays.Value);
    }
}
public class EntityFunctionsFakerVisitor : ExpressionVisitor
{
    protected override Expression VisitMethodCall(MethodCallExpression node)
    {
        if (node.Method.DeclaringType == typeof(EntityFunctions))
        {
            var visitedArguments = Visit(node.Arguments).ToArray();
            return Expression.Call(typeof(EntityFunctionsFake), node.Method.Name, node.Method.GetGenericArguments(), visitedArguments);
        }

        return base.VisitMethodCall(node);
    }
}
class VisitedQueryProvider<TVisitor> : IQueryProvider
    where TVisitor : ExpressionVisitor, new()
{
    private readonly IQueryProvider _underlyingQueryProvider;
    public VisitedQueryProvider(IQueryProvider underlyingQueryProvider)
    {
        if (underlyingQueryProvider == null) throw new ArgumentNullException();
        _underlyingQueryProvider = underlyingQueryProvider;
    }

    private static Expression Visit(Expression expression)
    {
        return new TVisitor().Visit(expression);
    }

    public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
    {
        return new VisitedQueryable<TElement, TVisitor>(_underlyingQueryProvider.CreateQuery<TElement>(Visit(expression)));
    }

    public IQueryable CreateQuery(Expression expression)
    {
        var sourceQueryable = _underlyingQueryProvider.CreateQuery(Visit(expression));
        var visitedQueryableType = typeof(VisitedQueryable<,>).MakeGenericType(
            sourceQueryable.ElementType,
            typeof(TVisitor)
            );

        return (IQueryable)Activator.CreateInstance(visitedQueryableType, sourceQueryable);
    }

    public TResult Execute<TResult>(Expression expression)
    {
        return _underlyingQueryProvider.Execute<TResult>(Visit(expression));
    }

    public object Execute(Expression expression)
    {
        return _underlyingQueryProvider.Execute(Visit(expression));
    }
}
public class VisitedQueryable<T, TExpressionVisitor> : IOrderedQueryable<T>
    where TExpressionVisitor : ExpressionVisitor, new()
{
    private readonly IQueryable<T> _underlyingQuery;
    private readonly VisitedQueryProvider<TExpressionVisitor> _queryProviderWrapper;
    public VisitedQueryable(IQueryable<T> underlyingQuery)
    {
        _underlyingQuery = underlyingQuery;
        _queryProviderWrapper = new VisitedQueryProvider<TExpressionVisitor>(underlyingQuery.Provider);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _underlyingQuery.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public Expression Expression
    {
        get { return _underlyingQuery.Expression; }
    }

    public Type ElementType
    {
        get { return _underlyingQuery.ElementType; }
    }

    public IQueryProvider Provider
    {
        get { return _queryProviderWrapper; }
    }
}

这是一个使用示例:

var linq2ObjectsSource = new List<DateTime?>() { null }.AsQueryable();
var visitedSource = new VisitedQueryable<DateTime?, EntityFunctionsFakerVisitor>(linq2ObjectsSource);
var visitedQuery = visitedSource.Select(dt => EntityFunctions.AddDays(dt, 1));
var results = visitedQuery.ToList();
Assert.AreEqual(1, results.Count);
Assert.AreEqual(null, results[0]);

通过这种方式,您可以获得所有理想的特征:

  • 开发者可以继续使用该标准EntityFunctions由实体框架定义;
  • 如果不在数据库上运行,生产实现仍然保证会引发异常;
  • 可以针对假存储库测试查询;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对包含 EntityFunctions.AddDays 函数的 GetNewValues() 进行单元测试 的相关文章

  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 在python中批处理非常大的文本文件

    我正在尝试将一个非常大的文本文件 大约 150 GB 批处理为几个较小的文本文件 大约 10 GB 我的一般流程是 iterate over file one line at a time accumulate batch as strin
  • Interop.Word Documents.Open 为空

    我正在尝试使用 Interop Word Application 打开 docx 文件并转换为 PDF 它作为控制台应用程序工作 但如果我在我的网络应用程序中使用相同的东西 它就不起作用 我尝试查看该文件夹的权限 我给予 网络服务 完全控制
  • 在 Java 中从字符串中解析对象

    我正在尝试编写一个通用方法来解析字符串中的对象 需要明确的是 我有以下不太优雅的实现 public static Object parseObjectFromString String s Class class throws Except
  • 我应该同步静态易失性变量吗?

    关于这个主题有几个问题 但大多数都回避了这个问题 因为这不是问题的意图 如果我的类中有一个静态易失性 private static volatile MyObj obj null 在下面的方法中我这样做 public MyObj getMy
  • RxJs:条件为真时缓冲事件,条件为假时传递事件

    我在下面创建了 Observable 构造函数 其工作原理如下 有谁知道是否有更简洁的方法使用 RxJ 附带的运算符来实现相同的行为 我在看缓冲区切换 http reactivex io rxjs class es6 Observable
  • 根据另一列中的 4 个值创建新列

    我想根据另一列中的 4 个值创建一个新列 if col1 1 then col2 G if col1 2 then col2 H if col1 3 then col2 J if col1 4 then col2 K 我如何在 R 中执行此
  • Raphaeljs 库和智能手机

    我使用了名为 worderfull 的 javascript 库拉斐尔伊斯 http raphaeljs com 在我的网站上绘制地图 动画和动画功能 我注意到使用这个库的脚本与iPhone但不与Android 有人可以确认这一点吗 只需进
  • 未定义的行为追溯是否意味着不能保证早期可见的副作用?

    在 C 中 如果我正确理解措辞 编译器可以假设不会发生 UB 从而影响将遇到 UB 但尚未遇到的执行路径中的行为 甚至是 I O 等可见的副作用 在抽象机遇到 UB 之前 C 是否需要 正确 执行程序直至最后可见的副作用 编译器似乎以这种方
  • 从源代码管理中排除在 Visual Studio 2013 中实际上不起作用?

    我已通过 文件 gt 源代码管理 gt 高级 gt 从源代码管理中排除 选项从 Visual Studio 2013 中的源代码管理中排除了某些文件 我看到我的目标文件旁边弹出一个小图标 上面写着 从源代码管理中排除 但是 每次对同一文件进
  • C# Visual Studio 单元测试,模拟客户端 IP 地址

    我正在编写一些单元测试 当尝试执行以下操作时 我的真实代码抛出了异常 string IPaddress HttpContext Current Request UserHostName ToString 有没有一种方法可以模拟 IP 地址
  • 在 PHP 中创建(日期,值)的数组/集合/列表

    我正在编写一个 PHP 脚本 其中输入为 From date To date 然后我想获取该日期范围并创建一个具有以下内容的某种数组 Array date x 当我将每个日期添加到数组中时 我将计算与之相关的值 对于 NET 我会 突然想到
  • iOS 应用程序提交中的导出合规性

    我制作了一个新应用程序并想提交到应用程序商店 但在最终提交时 有出口合规性检查 我应该检查什么是或否 我在我的应用程序中使用 https url 请帮我 提前致谢 当你知道你ARE符合导出要求 您可以将其放入您的 Info plist 中
  • 如何计算数字和数学运算符的数组(或字符串)

    我正在制作一个计算器 并将单击的所有数字和运算符推送 保存到数组和字符串中 我想知道哪个approach 在这种情况下是最好的 从输入生成字符串或数组OR我想不出更好的方法 我想计算数组或字符串 该字符串给出了错误的答案 我不知道如何计算数
  • UIMA 与 Spark

    正如中所述here https spark summit org 2014 leveraging uima in spark UIMA 和 Spark 在分发基础设施方面有一些重叠 我本来打算将 UIMA 与 Spark 一起使用 现在我要
  • 你能阻止 StreamReader 处理底层流吗?

    有没有办法做到这一点 this logFile File Open what r u doing log FileMode OpenOrCreate FileAccess ReadWrite using var sr new StreamR
  • 在 Pandas 中将索引转换为 MultiIndex(分层索引)

    在我正在使用的数据中 索引是复合的 即它既有项目名称又有时间戳 例如 email protected cdn cgi l email protection 2013 05 07 05 52 51 0200 我想要进行分层索引 以便将相同的电
  • java.io.IOException:android中连接上的流意外结束

    我有网络服务 URL 它工作正常 它给出了 JSON 数据 当我使用时HttpURLConnection and InputStream 我收到此错误 java io IOException unexpected end of stream
  • 使用 Selenium 在 Firefox 上单击 Javascript 链接

    我试图从汽车博客上获取一些评论 Jalopnik http jalopnik com 5912009 prius driver beat up after taking out two bikers 它最初并不随网页一起提供 而是通过一些
  • 在android中管理工具栏的导航和后退按钮从片段到片段

    我所有的片段都是通过控制的ActionBarActivity 主要活动 里面主要活动 a DrawerLayout已实现 所有子片段均通过抽屉布局的列表项单击推送 我面临的问题是通过抽屉布局推送片段后我想将抽屉图标更改为后退图标ToolBa
  • 如何对包含 EntityFunctions.AddDays 函数的 GetNewValues() 进行单元测试

    下面的示例代码在生产中运行良好 但不能是单元 因为 EntityFunctions 进行了测试 我的单元测试项目正在使用 InMemoryDatabase 而不是真正的 SQL 数据库 我可以轻松解决我的问题 通过在 SQL 数据库中使用计