2012-10-17 74 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

是的,這工作完美。謝謝! –