犀牛存根不与 Arg 一起工作<object>。是平等的



我有一个方法,它将对象作为参数

方法签名

  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与匿名对象

相关内容

最新更新