我需要为属性返回的方法设置返回值,基本上我需要设置它的作用:
mockedObject.TheProperty.GetTheValues()
我只需要它返回Enumerable.Empty<MyType>
。
答案 0 :(得分:2)
为了证明假设功能存在
public interface IFoo {
IBar TheProperty { get; set; }
}
public interface IBar {
IEnumerable<MyType> GetTheValues();
}
public class MyType { }
Moq允许自动模拟层次结构,也称为递归模拟
[TestClass]
public class RecursiveMocksTests {
[TestMethod]
public void Foo_Should_Recursive_Mock() {
//Arrange
IEnumerable<MyType> expected = Enumerable.Empty<MyType>();
var mock = new Mock<IFoo>();
// auto-mocking hierarchies (a.k.a. recursive mocks)
mock.Setup(_ => _.TheProperty.GetTheValues()).Returns(expected);
var mockedObject = mock.Object;
//Act
IEnumerable<MyType> actual = mockedObject.TheProperty.GetTheValues();
//Assert
actual.Should().BeEquivalentTo(expected);
}
}
请注意,IBar
从未初始化或配置过。由于上面显示的设置,框架将自动模拟该接口。
但是,如果IBar
需要更多功能,则应该进行适当的模拟并相应地进行配置。也没有什么能阻止通过IBar
模拟使用配置多个IFoo
成员。
答案 1 :(得分:1)
想象一下你有这个:
public interface IA
{
IEnumerable<MyType> TheProperty { get; set; }
}
public class MyType {}
接下来是如何模拟它,以便在调用TheProperty
时,它返回并IEnumerable.Empty<MyType>
:
[TestMethod]
public void SomeTest()
{
/* Arrange */
var iAMock = new Mock<IA>();
iAMock.Setup(x => x.TheProperty).Returns(Enumerable.Empty<MyType>());
/* Act */
/* Assert */
}