使用 Moq 设置并验证表达式

2023-11-26

有没有办法设置和验证使用带有 Moq 的表达式的方法调用?

第一次尝试是我想让它工作的一次,而第二次尝试是一个“补丁”,让Assert部分有效(验证部分仍然失败)

string goodUrl = "good-product-url";

[Setup]
public void SetUp()
{
  productsQuery.Setup(x => x.GetByFilter(m=>m.Url== goodUrl).Returns(new Product() { Title = "Good product", ... });
}

[Test]
public void MyTest()
{
  var controller = GetController();
  var result = ((ViewResult)controller.Detail(goodUrl)).Model as ProductViewModel;
  Assert.AreEqual("Good product", result.Title);
  productsQuery.Verify(x => x.GetByFilter(t => t.Url == goodUrl), Times.Once());
}

测试失败于Assert并抛出空引用异常,因为从未调用方法 GetByFilter。

如果我用这个

[Setup]
public void SetUp()
{
  productsQuery.Setup(x => x.GetByFilter(It.IsAny<Expression<Func<Product, bool>>>())).Returns(new Product() { Title = "Good product", ... });
}

测试通过了断言部分,但是这次是验证失败,说它从未被调用。

有没有办法使用特定表达式而不是使用通用表达式来设置方法调用It.IsAny<>()?

Update

我也尝试了建议乌福克·哈奇奥古拉里在评论中并创建了以下内容

Expression<Func<Product, bool>> goodUrlExpression = x => x.UrlRewrite == "GoodUrl";

[Setup]
public void SetUp()
{
  productsQuery.Setup(x => x.GetByFilter(goodUrlExpression)).Returns(new Product() { Title = "Good product", ... });
}

[Test]
public void MyTest()
{
  ...
  productsQuery.Verify(x => x.GetByFilter(goodUrlExpression), Times.Once());
}

但我得到了一个空引用异常,就像第一次尝试一样。

我的控制器中的代码如下

public ActionResult Detail(string urlRewrite)
{
  //Here, during tests, I get the null reference exception
  var entity = productQueries.GetByFilter(x => x.UrlRewrite == urlRewrite);
  var model = new ProductDetailViewModel() { UrlRewrite = entity.UrlRewrite, Culture = entity.Culture, Title = entity.Title };
  return View(model);
}

以下代码演示了如何在此类场景中进行测试。总体思路是针对“真实”数据执行传入的查询。这样,你甚至不需要“验证”,就好像查询不正确一样,它不会找到数据。

修改以满足您的需求:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Moq;
using NUnit.Framework;

namespace StackOverflowExample.Moq
{
    public class Product
    {
        public string UrlRewrite { get; set; }
        public string Title { get; set; }
    }

    public interface IProductQuery
    {
        Product GetByFilter(Expression<Func<Product, bool>> filter);
    }

    public class Controller
    {
        private readonly IProductQuery _queryProvider;
        public Controller(IProductQuery queryProvider)
        {
            _queryProvider = queryProvider;
        }

        public Product GetProductByUrl(string urlRewrite)
        {
            return _queryProvider.GetByFilter(x => x.UrlRewrite == urlRewrite);
        }
    }

    [TestFixture]
    public class ExpressionMatching
    {
        [Test]
        public void MatchTest()
        {
            //arrange
            const string GOODURL = "goodurl";
            var goodProduct = new Product {UrlRewrite = GOODURL};
            var products = new List<Product>
                {
                    goodProduct
                };

            var qp = new Mock<IProductQuery>();
            qp.Setup(q => q.GetByFilter(It.IsAny<Expression<Func<Product, bool>>>()))
              .Returns<Expression<Func<Product, bool>>>(q =>
                  {
                      var query = q.Compile();
                      return products.First(query);
                  });

            var testController = new Controller(qp.Object);

            //act
            var foundProduct = testController.GetProductByUrl(GOODURL);

            //assert
            Assert.AreSame(foundProduct, goodProduct);
        }
    }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Moq 设置并验证表达式 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 验证用户输入?

    我对某事感到非常困惑 想知道是否有人可以解释 在 PHP 中 我验证用户输入 因此 htmlentitiies mysql real escape string 在插入数据库之前使用 而不是在所有内容上使用 因为我更喜欢尽可能使用正则表达式
  • 带接口的 Angular 6 服务

    我正在使用 Angular 构建一个应用程序 6 0 7 我正在尝试使用新的服务创建服务 Injectable providedIn root 但是如何使用接口进行注入呢 问题 我有2个服务 认证服务 and 会话存储 service 我想
  • 内联限定符源于原型还是定义?

    我对标准中的这一点不太确定 假设我有三个这样的文件 foo h include
  • 如何强制 Postgresql 用户使用密码登录

    我所做的一切都在我的local机 Mac 操作系统 安装postgresql后 我创建了一个名为pote的用户和密码 然后创建了一个名为poems的数据库 该数据库的所有者是pote 我好奇的是我可以不用密码登录诗人的诗歌 命令是psql
  • 您是否将单元测试与集成测试分开? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我只是想知道是否还有其他人
  • Facebook 图 api 搜索结果取决于位置?

    我尝试使用图形搜索 API 获取结果 我注意到在我的计算机 阿根廷 中执行的结果与在服务器 法国 中运行时的结果不同 是这样的吗 如何强制指定搜索位置 谢谢 Sascha Galley 我还找到了另一种简单的方法 只需添加 locale e
  • 为什么 minmax(0, 1fr) 对于长元素有效,而 1fr 则无效?

    所以我有这个网格 div p 1000 characters long p div Inside p有一个超长的字符串 没有空格 divs 是具有固定尺寸的占位符 这会产生以上结果 display grid grid auto flow c
  • 在 ajax 数组中使用 jQuery .serialize() 将 PHP $_POST 作为变量传递?

    这是我用来将表单详细信息发送到 php 函数的 jQuery 代码 jQuery document ready function jQuery submit click function var str ajaxForms serializ
  • 如果我不使用栅栏,一个核心需要多长时间才能看到另一个核心的写入?

    我一直在尝试用谷歌搜索我的问题 但老实说我不知道 如何简洁地陈述这个问题 假设我在多核英特尔系统中有两个线程 这些线程在同一个 NUMA 节点上运行 假设线程 1 向 X 写入一次 然后偶尔向前读取它 进一步假设线程 2 连续读取 X 如果
  • C++ 模板:“不是从类型派生的”

    为什么此代码无效 include
  • git:修改维护分支并将这些补丁应用到另一个分支的正确合并或变基工作流程是什么?

    客观的 我需要为上游项目的先前版本制作自定义补丁 并且我希望能够将这些补丁应用到更高版本 Problem 从维护分支变基到更高版本会与维护分支中未修改的文件发生冲突 怀疑 对于我想要完成的任务 我错误地应用了合并或变基 示例 这是我想要完成
  • PHP:使用单独数组中定义的路径设置多维关联数组元素的值

    好的 我有一个包含以下元素的数组 array a b 0 c array a b 1 c array a d 0 c c array b c 然后在一个单独的数组中 我定义了这些值的路径 structure 0 array a b c st
  • autocomplete= off 在 chrome 中不起作用

    我们正在开发一款网络应用程序 其中有一个付款页面 其中我们有两个文本框 第一个用于信用卡号 第二个用于验证码 并输入 密码 现在的问题是 当在 google chrome 中加载页面时 它发现 type Password 它加载在信用卡文本
  • iOS5 稳定应用程序在 iOS4.3 模拟器中崩溃

    我收到 NSInvalidArgumentException 原因如下 UITapGestureRecognizer initWithCoder unrecognized selector sent to instance 我的理解是 UI
  • 静态初始化块

    据我了解 静态初始化块 用于设置静态字段的值 如果不能在一行中完成 但我不明白为什么我们需要一个特殊的块 例如 我们将一个字段声明为静态 没有赋值 然后编写几行代码 生成并为上面声明的静态字段赋值 为什么我们需要在一个特殊的块中使用这些行
  • 尝试创建一个名为“List”的类,但 list() 函数破坏了它

    class List public function hello return hello list new List echo list hello 给出错误 PHP Parse error syntax error unexpected
  • 否则停止路线

    你好 有一条这样的路线
  • 为什么 NaN 不等于 NaN? [复制]

    这个问题在这里已经有答案了 相关的 IEEE 标准定义了一个数字常量 NaN 不是数字 并规定 NaN 应该与自身进行比较 这是为什么 我熟悉的所有语言都实现了这个规则 但它经常会导致严重的问题 例如 当 NaN 存储在容器中时 当 NaN
  • 使用 Fluent nHibernate 映射到多个表

    这是我的情况 假设您有以下模型实体 它们各自代表单个表 Movies 电影 ID 标题 评级 Actors 演员 ID 名字 姓氏 Director 导演 ID 名字 姓氏 另一个实体 表称为 推荐 它代表网站内用户之间的推荐 这个想法是推
  • 使用 Moq 设置并验证表达式

    有没有办法设置和验证使用带有 Moq 的表达式的方法调用 第一次尝试是我想让它工作的一次 而第二次尝试是一个 补丁 让Assert部分有效 验证部分仍然失败 string goodUrl good product url Setup pub