如何在get接口上使用SetupAllProperties

本文关键字:SetupAllProperties 接口 get | 更新日期: 2023-09-27 18:15:36

我想看看是否有办法得到这个

public interface IFoo
{
    int MyProp { get; }
}
[Fact]
public void Test
{
    var mock = new Mock<IFoo>();
    mock.SetupAllProperties();
    mock.Object.MyProp = 12; // this does not work because there is a get.
}

我知道我可以使用mock.SetupGet,但由于我的界面上有很多属性,我不想在每个属性上都做SetupGet

如何在get接口上使用SetupAllProperties

你没有回应我的评论,但如果你想使用反射,你可以找到所有属性(相关类型)并为此创建Setup (Expression类需要指令using System.Linq.Expressions;在范围内;我们创建了自己的表达式树):

var mock = new Mock<IFoo>();
var parameterExpression = Expression.Parameter(typeof(IFoo));
foreach (var property in typeof(IFoo)
  .GetProperties().Where(x => x.PropertyType == typeof(int))
  )
{
  var lambdaExpression = Expression.Lambda<Func<IFoo, int>>(
    Expression.Property(parameterExpression, property),
    parameterExpression);
  mock.Setup(lambdaExpression).Returns(12);
}

后来补充:Not sure I really understand your question.

如果你有很多属性和很多值,强类型的,你可以这样做:

var mock = new Mock<IFoo>(MockBehavior.Strict);
mock.Setup(x => x.MyProp).Returns(12);
mock.Setup(x => x.MyOtherProp).Returns(3.14);
mock.Setup(x => x.MyThirdProp).Returns("test");
...
mock.Setup(x => x.MyLastProp).Returns(new DateTime(2015, 1, 1));
var objToUse = mock.Object;

或做的事:

var rep = new MockRepository(MockBehavior.Strict);
var objToUse = rep.OneOf((IFoo x) =>
    x.MyProp == 12
    && x.MyOtherProp == 3.14
    && x.MyThirdProp == "test"
    && ...
    && x.MyLastProp == new DateTime(2015, 1, 1)
    );

我认为它不可能变得更麻烦了。如果您想要一个松散的模拟,有var objToUse = Mock.Of((IFoo x) => x.MyProp == 12 && ...);,几乎是一行代码。

相关文章:
  • 没有找到相关文章