在属性上模拟方法

时间:2018-04-11 21:33:58

标签: c# moq

我需要为属性返回的方法设置返回值,基本上我需要设置它的作用:

mockedObject.TheProperty.GetTheValues()

我只需要它返回Enumerable.Empty<MyType>

2 个答案:

答案 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成员。

参考Moq Quickstart: Properties

答案 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 */
}