2013-04-23 69 views
2

我願意用Foq來模擬IBus你可以在foq中設置遞歸模擬嗎?

IBus上的方法之一是OpenPublishChannel,它返回IPublishChannel。 IPublishChannel又有一個Bus屬性,它返回父項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() 

回答

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 
+0

好極了!謝謝@Phillip Trelford。不敢相信我沒注意到這個單位 - >'TValue過載。 – mavnn 2013-04-23 11:01:24

相關問題