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"错误。我试过犀牛模拟和最小起订量。

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

4

1 回答 1

2

我不知道这是否是匹配匿名对象的唯一方法,但可以使用 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;
}
于 2012-10-17T09:07:59.093 回答