如何在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
。
你没有回应我的评论,但如果你想使用反射,你可以找到所有属性(相关类型)并为此创建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 && ...);
,几乎是一行代码。