我有一个将对象作为参数
的方法方法签名
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模拟它不起作用(不返回存根返回对象。)
_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 } });
这可行(确实返回了存根返回对象。)
_procExecutor.Stub(x => x.ExecuteSql<ObjectToReturn>(Arg<string>.Is.Anything,
Arg<object>.Is.Anything)).Return(new List<ObjectToReturn>() { new ObjectToReturn() { id = 100 } });
但是我想确保将正确的参数传递给正确的字段,所以我将方法保存为#1,但它不返回存根返回对象。
我在示例1中做错了什么?
答案 0 :(得分:0)
问题是匿名arg你可以使用像这样的例子:
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;
}
}
}
来源: