我有一个方法,它将对象作为参数
方法签名
IEnumerable<TResult> ExecuteSql<TResult>(string sql, object param)
方法调用
string query ="select * from table";
var data = _Executor.ExecuteSql<ObjectToReturn>(query,
new
{
CustomerID = customerId,
AnotherId1= id2,
AnotherId2 = id3
});
单元测试
使用下面的示例1模拟它不工作(不返回存根返回对象。)
1
_procExecutor.Stub(x => x.ExecuteSql<ObjectToReturn>(Arg<string>.Is.Anything,
Arg<object>.Is.Equal(new
{
CustomerID = customerId,
AnotherId1 = 10,
AnotherId2 = 11
}))).Return(new List<ObjectToReturn>() { new ObjectToReturn() { id = 100 } });
这是有效的(确实返回存根返回对象。)
2
_procExecutor.Stub(x => x.ExecuteSql<ObjectToReturn>(Arg<string>.Is.Anything,
Arg<object>.Is.Anything)).Return(new List<ObjectToReturn>() { new ObjectToReturn() { id = 100 } });
但我想确保正确的参数被传递到正确的字段,所以我像#1一样存根了我的方法,但它不返回存根的返回对象。
示例1中我做错了什么
问题是匿名arg,您可以像下面这样使用Matches:
IUrlProvider urlProvider = MockRepository.GenerateStub<IUrlProvider>();
urlProvider.Stub(u => u.Action(
Arg<string>.Is.Equal("ValidateCode"),
Arg<object>.Matches(new PropertiesMatchConstraint(new { code = "spam-and-eggs" })) ))
.Return("");
public class PropertiesMatchConstraint : AbstractConstraint
{
private readonly object _equal;
public PropertiesMatchConstraint(object obj)
{
_equal = obj;
}
public override bool Eval(object obj)
{
if (obj == null)
{
return (_equal == null);
}
var equalType = _equal.GetType();
var objType = obj.GetType();
foreach (var property in equalType.GetProperties())
{
var otherProperty = objType.GetProperty(property.Name);
if (otherProperty == null || property.GetValue(_equal, null) != otherProperty.GetValue(obj, null))
{
return false;
}
}
return true;
}
public override string Message
{
get
{
string str = _equal == null ? "null" : _equal.ToString();
return "equal to " + str;
}
}
}
来源:
Arg<对象>。Is.Equal与匿名对象