我如何模拟作为接口的接口属性

时间:2016-01-14 23:25:27

标签: c# interface mocking moq

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);

抱怨它无法将IFoo2转换为Moq.Mock<IFoo2>

  

错误CS1503参数1:无法转换为&#39; Moq.Mock&lt; IFoo2&gt;&#39;到&#39; IFoo2&#39;

2 个答案:

答案 0 :(得分:4)

引用Object属性以访问模拟的实例。

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

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

答案 1 :(得分:2)

它不起作用的原因是你在设置外部模拟时忘记了内部模拟实例上的.Object(参见Grant 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