使用匿名类型参数模拟方法

时间:2012-10-17 04:28:09

标签: c# unit-testing mocking tdd moq

我有以下代码:

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"错误。我试过犀牛嘲笑和moq。

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

1 个答案:

答案 0 :(得分:1)

我不知道这是否是匹配匿名对象的唯一方法,但可以使用It.Is&lt;&gt;()和反射来完成

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