gpt4 book ai didi

f# - 你能在 foq 中设置递归模拟吗?

转载 作者:行者123 更新时间:2023-12-04 05:00:52 27 4
gpt4 key购买 nike

我想模拟一个 IBus与福克。
IBus 上的方法之一是 OpenPublishChannel ,返回 IPublishChannel . IPublishChannel 又具有 Bus返回父级的属性 IBus .

我当前的代码如下,但显然它没有编译,因为 mockBus 不是由我需要的点定义的。有没有一种方法可以设置这样的递归模拟,而无需创建两个接口(interface)的模拟?

open System
open EasyNetQ
open Foq

let mockChannel =
Mock<IPublishChannel>()
.Setup(fun x -> <@ x.Bus @>).Returns(mockBus)
.Create()
let mockBus =
Mock<IBus>()
.Setup(fun x -> <@ x.OpenPublishChannel() @>).Returns(mockChannel)
.Create()

最佳答案

Foq 支持 Returns : unit -> 'TValue 方法,因此您可以懒惰地创建一个值。

使用一点突变实例可以互相引用:

type IPublishChannel =
abstract Bus : IBus
and IBus =
abstract OpenPublishChannel : unit -> IPublishChannel

let mutable mockBus : IBus option = None
let mutable mockChannel : IPublishChannel option = None

mockChannel <-
Mock<IPublishChannel>()
.Setup(fun x -> <@ x.Bus @>).Returns(fun () -> mockBus.Value)
.Create()
|> Some

mockBus <-
Mock<IBus>()
.Setup(fun x -> <@ x.OpenPublishChannel() @>).Returns(fun () -> mockChannel.Value)
.Create()
|> Some

关于f# - 你能在 foq 中设置递归模拟吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16167068/

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