2012-05-05 52 views
10

说我有以下几点:如何嘲笑一个方法调用,需要一个动态对象

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

和我有下面的代码,我想测试:

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

我怎么会嘲笑这个电话?

使用起订量,我厌倦了这样:

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

并没有奏效。返回的结果为空

我也试着做以下与犀牛嘲笑:

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

没有任何运气。再次为空。

那么我该怎么做呢?

谢谢,

回答

22

在解决方案是用反射一起使用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); 
    } 
} 
+0

完美!正是我需要的。谢谢! –

0

起订量为这种情况下,提供It.IsAny<T>

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

*动态是任何对象

+1

感谢ai.farfa。我不能这样做,因为我需要根据动态对象上的不同属性来确定返回哪个对象。 –

1

第一所有的匿名对象都不是真的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); 
    } 
} 
相关问题