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;
答案 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