将MOQ属性设置转换为FakeItEasy
问题描述:
在其中一个“构建器”中,我们使用以下方法使用MOQ SetupGet。我试图重写它来使用FakeItEasy,但似乎没有办法做到这一点,因为WithReturnType只提供通用版本,其中类型必须事先知道。 没有非通用版本,需要在运行时确定的实际类型。将MOQ属性设置转换为FakeItEasy
准许我花了整整30分钟。在FakeItEasy,所以有可能是一个更好的办法...
原来的方法与MOQ
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
CommandFake.SetupGet(expression).Returns(value);
}
用我有限的表情我试图重写它使用FakeItEasy的知识,但我不能设置返回值。
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
var methodName = string.Empty;
var e = (LambdaExpression) expression;
if (e.Body.NodeType == ExpressionType.MemberAccess)
{
var memberInfo = ((MemberExpression) e.Body).Member;
if (memberInfo.MemberType == MemberTypes.Property)
{
methodName = "get_" + memberInfo.Name;
}
//A.CallTo(CommandFake).Where(call => call.Method.Name == methodName)
// .WithReturnType<>()
}
//CommandFake.SetupGet(expression).Returns(value);
}
有没有其他方法可以做到这一点?我没有卡住With的这个方法签名。
这也将工作
public void With(Expression<Action<TCommand>> expression)
这样就可以做到
With(x=>x.someProp=someValue)
答
我不是个起订量的用户,但它看起来像SetupGet
只定义上的属性获取的动作。这似乎相当于FakeItEasy中的A.CallTo
。
有什么理由不只是使用
A.CallTo(() => CommandFake.TheProperty).Returns(value));
?
如果你真的希望能够调用类似
With(f => f.TheProperty, 7);
你可以(从例如工作)使用
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
var methodName = string.Empty;
var e = (LambdaExpression)expression;
if (e.Body.NodeType == ExpressionType.MemberAccess)
{
var memberInfo = ((MemberExpression)e.Body).Member;
if (memberInfo.MemberType == MemberTypes.Property)
{
methodName = "get_" + memberInfo.Name;
}
A.CallTo(CommandFake).Where(call => call.Method.Name == methodName)
.WithReturnType<TProperty>()
.Returns(value);
}
}
甚至可以考虑只使用属性的方法顾左右而言他,而不是名称:
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
var e = (LambdaExpression)expression;
if (e.Body.NodeType == ExpressionType.MemberAccess)
{
var memberInfo = ((MemberExpression)e.Body).Member;
if (memberInfo.MemberType == MemberTypes.Property)
{
A.CallTo(CommandFake).Where(call =>
call.Method == ((PropertyInfo)memberInfo).GetMethod)
.WithReturnType<TProperty>()
.Returns(value);
}
}
}
我试图得到一个辅助方法签名With(Expression>表达式)工作,并且在那里我没有TProperty,并且我完全忘记了泛型参数:)。感谢您指出了这一点。 –
epitka
很高兴帮助。 –