2

我会让用 Foq 模拟一个IBus

上的方法之一IBusOpenPublishChannel,它返回一个IPublishChannel。IPublishChannel 又具有Bus返回 parent 的属性IBus

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

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()
4

1 回答 1

3

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
于 2013-04-23T10:58:29.493 回答