How to mock a method call that takes a dynamic object
c#, mocking, moq, rhino-mocks
Solution
You can use the `It.Is<object>` matcher together with reflection. You cannot use dynamic in expression trees so `It.Is<dynamic>` won't work that's why you need reflection to get the your property value by name:
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 });
Where `GetPropertyValue` is a little helper:
public static class ReflectionExtensions
{
public static T GetPropertyValue<T>(this object obj, string propertyName)
{
return (T) obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}
}
Problem
Say I have the following: ``` public interface ISession { T Get<T>(dynamic filter); } } ``` And I have the following code that I want to test: ``` var user1 = session.Get<User>(new {Name = "test 1"}); var user2 = session.Get<User>(new {Name = "test 2"}); ``` How would I mock this call? Using Moq, I tired doing this: ``` 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}); ``` And that didn't work. The returned results is null I also tried to do the following with Rhino Mocks: ``` var session = MockRepository.GenerateStub<ISession>(); session.Stub(x => x.Get<User>(new {Name = "test 1"})).Return(new User{Id=1}); ``` No luck either. Null again. So how would I do this? Thanks,