将 Foq 与 F# 函数类型结合使用

2024-05-11

例如,我使用 F# 类型定义来防止函数之间的硬依赖

type IType1 = int -> int
type IType2 = int-> string

let func1 (i : int) : int = i * i
let func2 (i : int) : string = i |> string

let higherFunc (dep1 : IType1) (dep2 : IType2) (input : int) : string =
    input |> dep1 |> dep2

let curriedFunc = higherFunc func1 func2
let x = curriedFunc 2

输出x:“4”

显然,这是非常人为且简单的,但想象一下依赖项是一个解析器和一个排序器或其他什么。我正在编写的更小的功能颗粒。

我正在尝试使用 Foq 来帮助我的单元测试装置。这是我正确使用 F# 的第一周,我很难尝试弄清楚如何配置这些类型的模拟。

有两件事值得一提:

1 - 如果我使用抽象类,我可以让它工作,但我不想这样做,因为对于完全相同的最终结果来说,这会带来更多麻烦。例如

type IType1 = 
    abstract member doSomething : int -> int

type func1 () =
    interface IType1 with
        member this.doSomething (i: int) = i * i

允许我设置一个模拟

let mT1= Mock.With (fun (x : IType1) -> <@ x.doSomething(any()) --> 5 @>)

但我真的不想这样做。

2 - 如果我只是使用

type IType1 = int -> int
let mT1 = Mock.Of<IType1>()

然后我返回一个有效值,但是如果我尝试以任何方式配置它,例如

let mT1= Mock<IType1>.With (fun x -> <@ x(any()) --> 5 @>)

or

let mT1= Mock<IType1>.With (fun x -> <@ any() --> 5@>)

然后我得到一个例外

System.NotSupportedException : Expected standard function application: Call 

or

System.NotSupportedException : Expected standard function application: ValueWithName 

我希望我只是对语法感到愚蠢,并且可以做我想做的事。我已经尝试了我能想到的所有变体,包括 .Setup(conditions).Create() 的变体,但我在源代码中找不到任何示例。

我显然可以轻松地制作自己的模拟,例如

let mT1 (i : int) : int = 5

因为任何适合 int -> int 签名的东西都是有效的,但是如果我想检查该函数是否为 i 传递了某个值,我必须放入日志记录步骤等。如果有Foq 负责一些繁重的工作。

Edit我刚刚注意到根 Mock 对象的签名中有“需要引用类型”(即 Mock ) - 这是否意味着我没有机会模拟值?如果我不配置模拟,它怎么管理它?


你不必嘲笑。如果您的依赖项只是函数类型,则可以只提供函数:

let mT1= fun x -> 5

对象模拟的整个概念是(必须)由面向对象的人们发明的,以弥补对象组合不佳(或根本无法组合)的事实。当您的整个系统正常运行时,您可以当场创建功能。没有必要嘲笑。

如果你真的沉迷于使用 Foq 的设施,如日志记录和验证(我敦促你重新考虑:你的测试会变得更容易、更有弹性),你总是可以让自己成为一个对象,充当你的代理主机。功能:

type ISurrogate<'t, 'r> =
    abstract member f: 't -> 'r

// Setup
let mT1 = Mock.Create<ISurrogate<int, int>>()
mT1.Setup(...)...

let mT2 = Mock.Create<ISurrogate<int, string>>()
mT2.Setup...

higherFunc mT1.f mT2.f 42

mT1.Received(1).Call( ... ) // Verification

这样,丑陋的地方就仅限于您的测试,并且不会使您的生产代码变得复杂。

显然,这仅适用于单参数函数。对于具有多个柯里化参数的函数,您必须对参数进行元组并在注入站点将调用包装在 lambda 中:

// Setup
let mT1 = Mock.Create<ISurrogate<int * int, int>>()

higherFunc (fun x y -> mT1.f(x, y)) ...

如果您发现这种情况经常发生,您可以打包 lambda 创建以供重用:

let inject (s: ISurrogate<_,_>) x y = s.f (x,y)

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

将 Foq 与 F# 函数类型结合使用 的相关文章

  • 去除字符串的最佳方法是什么?

    我需要具有最佳性能的想法来删除 过滤字符串 I have string Input view 512 3 159 删除 view 和 的最佳性能方法是什么 和引号 我可以做这个 Input Input Replace view Replac
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • 并行应用程序的可变与不可变[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我正在编写的应用程序中 我需要编写大量基本类型 这些类型很可能是不可变的 但我想知道并行应用程序中可变类型与不可变类型的比较如何 您可以对可变
  • 包含routeChangeSuccess的AngularJS测试控制器

    我正在尝试创建单元测试来测试导航列表控制器 但在创建测试时遇到问题 这是控制器的代码 navListModule controller NavListCtrl scope NavList function scope NavList sco
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • DotNET 应用程序中的 GDI 句柄

    我的纯 DotNET 库作为非托管桌面应用程序中的插件运行 我收到了稳定的 虽然低 崩溃报告流 这些报告似乎表明 GDI 句柄存在问题 错误消息中的字体等 恢复为系统字体 各种控件的显示崩溃 不久后发生大规模崩溃 我的窗体几乎没有控件 但我
  • EasyNetQ 模型关闭

    我使用 EasyNetQ 实现了一个简单的 RabbitMQ 客户端 连接后 我收到一条通知 队列模型关闭 这是我的代码 var bus RabbitHutch CreateBus String Format host 0 hostName
  • Sitecore - 隐藏功能区中的按钮

    我为特定内容项创建了上下文功能区 我有两个按钮 可以将项目 升级 或 降级 到某一类别 该部分只能有一个 是否可以根据某种隐藏代码中的内容状态隐藏其中一个按钮 我了解如何链接到 Click 事件 但我想知道是否有某种加载事件可供自定义功能区
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 单元测试时 Android Studio 2.0 中测试状态终止且没有任何失败消息

    Issue 我昨天在 Ubuntu 上从 1 5 升级到了 Android Studio 2 0 当我在 Android Studio 2 0 中进行单元测试时 即使所有测试都已通过 它也会显示 终止测试 状态 有时它只显示部分测试通过 我
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何用方向键移动div

    我想使用 jQuery 用箭头键移动 div 所以右 左 下 上 找到了我想要完成的演示here http atomicrobotdesign com blog htmlcss move objects around the canvas
  • hibernate session 的 get() 和 load() 方法在获取方面有什么区别?

    get 和 load 方法有什么区别 关于数据获取方法 public static void main String args SessionFactory factory new Configuration configure build
  • python matplotlib 使用按钮事件添加和删除图形中的文本

    我试图在调用button press event 时将文本添加到鼠标指针位置的图形中 并在调用button release event 时将其删除 我已成功添加文本 但无法将其删除 这是我使用的代码的一部分 def onclick even
  • Javascript 3d 绘图实用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有什么好的 javascript 3d 绘图实用程序吗 我知道每个网站都推荐过画布 3d 图
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • 从导出的维基百科文章中检索中间语言链接?

    我曾经通过使用一些正则表达式解析导出来从导出的维基百科文章中检索中间语言链接 在第一阶段维基数据项目 https en wikipedia org wiki Wikipedia Wikidata这些链接已移至维基数据上的单独页面 例如文章厄
  • MVC URL 路由自定义 url

    我想传递 url 链接 例如 http localhost 24873 Jobs companyname or http localhost 24873 companyname Jobs Preferred 我尝试在全局 aspx 文件中进
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 如何以编程方式从 Excel 中的 VBA 宏中删除数字签名?

    有没有办法以编程方式从 Excel 工作表的 VBA 宏中删除数字签名 即相当于进入 VBA 编辑器 转到 工具 菜单 gt 数字签名 并单击 删除 的代码 有趣的问题 出于安全原因 它故意不属于 Excel 对象模型的一部分 可以从证书存
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 我可以从 DRF 中完全删除序列化程序吗?

    我正在尝试将 Django REST Framework 与 MongoDB 一起使用 我尝试将 Mongoengine 与 Django REST Framework Mongoengine 一起使用 但它不起作用 或者我做错了什么 但缺
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • Azure 函数核心工具安装卡在 Visual Studio Code 中

    我创建了 Azure 函数应用程序来执行 powershell 脚本 想先在我的本地运行它来测试它 当我运行它时 无论有没有调试选项 都会出现一个弹出窗口 其中显示 您必须安装 Azure Functions 核心工具才能调试本地函数 当我
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • Snakemake如何在上游规则失败时执行下游规则

    抱歉 标题不好 我不知道如何最好地用几句话解释我的问题 当其中一条规则失败时 我在处理 Snakemake 中的下游规则时遇到困难 在下面的示例中 黑桃规则在某些样本上失败 这是预料之中的 因为我的一些输入文件会有问题 黑桃将返回错误 并且
  • Quartz.Net 作业存储查询

    我正在当前项目中使用 Quartz NET 创建调度程序 就我而言 所有需要创建的作业都存储在一个表中 并且有一个单独的 UI 我可以在其中添加新作业或编辑现有作业 我的问题是如何将表中的所有作业提供给 Quartz 调度程序 我是否想要查
  • 有 Google Keep API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google Keep 有 API 吗 我想为 Google Keep 制作一个 Windows 8 应
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 将 Foq 与 F# 函数类型结合使用

    例如 我使用 F 类型定义来防止函数之间的硬依赖 type IType1 int gt int type IType2 int gt string let func1 i int int i i let func2 i int string