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

Скажем, у меня есть следующее:

<code>public interface ISession 
{
   T Get<T>(dynamic filter); }
}
</code>

И у меня есть следующий код, который я хочу проверить:

<code>var user1 = session.Get<User>(new {Name = "test 1"});
var user2 = session.Get<User>(new {Name = "test 2"});
</code>

Как бы я посмеялся над этим звонком?

Используя Moq, я устал делать это:

<code>var sessionMock = new Mock<ISession>();
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 1});
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 2});
</code>

И это не сработало. Возвращенные результаты являются нулевыми

Я также попытался сделать следующее с Rhino Mocks:

<code>var session = MockRepository.GenerateStub<ISession>();
session.Stub(x => x.Get<User>(new {Name = "test 1"})).Return(new User{Id=1});
</code>

Не повезло тоже. Снова ноль.

Так как бы я это сделал?

Спасибо,

Ответы на вопрос(3)

dynamic.

Если вы использовалиdynamic такие объекты, как

dynamic user1Filter = new ExpandoObject();
user1Filter.Name = "test 1";
var user1 = session.Get<User>(user1Filter);

Вы могли бы издеваться как

sessionMock.Setup(x => x.Get<User>(DynamicFilter.HasName("test 1")));

путем реализации пользовательского аргумента соответствия:

static class DynamicFilter
{
    [Matcher] public static object HasName(string name) { return null; }
    public static bool HasName(dynamic filter, string name)
    {
        string passedName = filter.Name; //dynamic expression
        return name.Equals(passedName);
    }
}

It.IsAny<T> для этого случая

sessionMock.Setup(x => x.Get<User>(It.IsAny<object>()).Returns(new User());

* динамический - это любой объект

 Chi Chan05 мая 2012 г., 08:22
Спасибо ai.farfa. Я не могу этого сделать, потому что мне нужно сказать, какой объект возвращать, основываясь на различных свойствах динамического объекта.
Решение Вопроса

It.Is<object> совпало с отражением. Вы не можете использовать динамический в деревьях выражений, такIt.Is<dynamic> не сработает, поэтому вам нужно подумать, чтобы получить значение вашей собственности по имени:

sessionMock
    .Setup(x => x.Get<User>(
        It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 1")))
    .Returns(new User{Id = 1});
sessionMock
    .Setup(x => x.Get<User>(
        It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 2")))
    .Returns(new User { Id = 2 });

кудаGetPropertyValue маленький помощник:

public static class ReflectionExtensions
{
    public static T GetPropertyValue<T>(this object obj, string propertyName)
    {
        return (T) obj.GetType().GetProperty(propertyName).GetValue(obj, null);
    }
}
 Chi Chan05 мая 2012 г., 17:22
Отлично! Именно то, что мне нужно. Спасибо!

Ваш ответ на вопрос