2016-01-14 58 views
0
public interface IFoo 
{ 
    IFoo2 Foo2 { get; } 
} 

public interface IFoo2 
{ 
    string FooMethod(); 
} 

說我有上面的2個接口。我試圖模擬在另一個接口上設置爲屬性的接口。這可能嗎?如何模擬接口屬性是一個接口

Mock<IFoo> mockFoo = new Mock<IFoo>(); 
Mock<IFoo2> mockFoo2 = new Mock<IFoo2>(); 

mockfoo.SetupGet<IFoo2>(x => x.Foo2).Returns(mockFoo2); 

抱怨說,它不能轉換到IFoo2Moq.Mock<IFoo2>

錯誤CS1503參數1:不能從 'Moq.Mock < IFoo2>' 轉換爲 'IFoo2'

+0

已更新,我正在使用Moq。 – Ryan

回答

2

參考Object屬性訪問模擬實例。

Mock<IFoo> mockFoo = new Mock<IFoo>(); 
Mock<IFoo2> mockFoo2 = new Mock<IFoo2>(); 

mockFoo.SetupGet(x => x.Foo2).Returns(mockFoo2.Object); 
+0

這是做到了。謝謝 – Ryan

+0

沒問題,yw。 –

1

之所以沒有工作是你在內部模擬實例忘記.Object當您設置外模擬(見格蘭特Winney的答案)。

但是請注意,您不需要必須明確提及內部模擬(您的mockFoo2)。您只需傳遞外部模擬一個「長」表達式樹,並使用額外的時間段.(「自動嘲諷層次結構(也稱爲recursive mocks)」)。像這樣:

Mock<IFoo> mockFoo = new Mock<IFoo>(); 
mockFoo.Setup(x => x.Foo2.FooMethod()).Returns("your string"); 

// use 'mockFoo.Object' for your test