2012-10-17 43 views
0

我有以下代码:嘲笑的方法与匿名类型参数

var connector = new Mock<IConector>(); 

connector 
    .Setup(cn => cn.listar("FetchEstandar", new Estandar(), new {Id = 1})) 
    .Returns(new List<Estandar>{ new Estandar {Id = 1} }); 

var entidad = connector.Object 
    .listar("FetchEstandar", new Estandar(), new {Id = 1}); 

当我打电话listar上的连接器对象,我得到一个"Expression Cannot Contain an Anonymouse Type"错误。我已经尝试过使用rhino mocks和moq。

有什么办法可以嘲笑这种方法吗?难道我做错了什么?或者,我可以忽略这个参数,但我不知道如何。我真的只需要测试第一个参数的值,并忽略参数的工作,但我不知道是否或如何我可以得到这个值,如果我使用它

+1

可以请您发布您的'IConector.listar'方法签名?你使用哪个moq版本?因为版本3.1.416.3在执行代码时不会引发任何错误。 – nemesv

+0

Moq 4.0.10827.0不会抛出任何错误,如果我使用'IEnumerable listar(字符串名称,Estandar estandar,对象ID);'作为listar的签名,但是设置永远不会匹配,因为设置中的新Estandar()与被调用时的新Estandar不同。 – AlanT

+0

是的,对不起,它确实有效,但返回一个空列表。 –

回答

1

我不知道这是否唯一的方法来匹配匿名对象,但它可以使用It.Is <>()和反射

public class Estandar { 
    public int Id { get; set; } 
} 

public interface IConector { 
    IEnumerable<Estandar> listar(string name, Estandar estandar, object key); 
} 


[TestMethod] 
public void CheckAnonymous() { 

    var connector = new Mock<IConector>(); 

    connector.Setup(cn => cn.listar("FetchEstandar", 
            It.IsAny<Estandar>(), 
            It.Is<object>(it => MatchKey(it, 1)))) 
      .Returns(new List<Estandar> { new Estandar { Id = 1 } }); 

    var entidad = connector.Object.listar("FetchEstandar", new Estandar(), new { Id = 1 }); 

    Assert.AreEqual(1, entidad.Count()); 

} 

public static bool MatchKey(object key, int soughtId) { 
    var ret = false; 
    var prop = key.GetType().GetProperty("Id"); 
    if (prop != null) { 
     var id = (int)prop.GetValue(key, null); 
     ret = id == soughtId; 
    } 
    return ret; 
} 
+0

是的,这工作完美。谢谢! –