Rhino Stub не работает с Arg<object>.Is.Равный

У меня есть метод, который принимает объект в качестве параметра

подпись метода

  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
                    });

модульный тест

Mocked it using below example 1 не работает(не возвращает объект stubbed return.)

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 } });      

это работает (возвращает объект stubbed return.)

2

_procExecutor.Stub(x => x.ExecuteSql<ObjectToReturn>(Arg<string>.Is.Anything,
                Arg<object>.Is.Anything)).Return(new List<ObjectToReturn>() { new ObjectToReturn() { id = 100 } });     

Но я хочу убедиться, что параметр right был передан в right fields, поэтому я заглушил свой метод, как #1, но он не возвращает объект stubbed return.

Что я делаю не так с примером 1?

1 ответ

  1. Проблема заключается в анонимном 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;
            }
        }
    }
    

    Источник:

    Arg<object>.Is.Равно анонимным объектам