将最小起订量 属性 设置转换为 FakeItEasy
Converting an MOQ property setup to FakeItEasy
在 "builders" 之一中,我们有以下使用 MOQ SetupGet 的方法。我尝试重写它以使用 FakeItEasy,但似乎没有办法做到这一点,因为 WithReturnType 仅提供通用版本,其中类型必须预先知道。
没有采用在 运行 时间确定的实际类型的非通用版本。
当然,我花了整整 30 分钟。在 FakeItEasy 上,所以可能会有更好的方法...
最小起订量的原始方法
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
CommandFake.SetupGet(expression).Returns(value);
}
由于我对表达式的了解有限,我尝试重写它以使用 FakeItEasy,但我无法设置 return 值。
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)
我不是 Moq 用户,但看起来 SetupGet
只是在 属性 get 上定义了一个操作。这似乎相当于 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);
}
}
}
在 "builders" 之一中,我们有以下使用 MOQ SetupGet 的方法。我尝试重写它以使用 FakeItEasy,但似乎没有办法做到这一点,因为 WithReturnType 仅提供通用版本,其中类型必须预先知道。 没有采用在 运行 时间确定的实际类型的非通用版本。
当然,我花了整整 30 分钟。在 FakeItEasy 上,所以可能会有更好的方法...
最小起订量的原始方法
public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
CommandFake.SetupGet(expression).Returns(value);
}
由于我对表达式的了解有限,我尝试重写它以使用 FakeItEasy,但我无法设置 return 值。
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)
我不是 Moq 用户,但看起来 SetupGet
只是在 属性 get 上定义了一个操作。这似乎相当于 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);
}
}
}