2012-10-17 4 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}); 

I 커넥터 개체에 listar 전화

가, 내가 "Expression Cannot Contain an Anonymouse Type" 오류가 발생합니다. 나는 코뿔소 조롱과 moq로 해봤습니다.

이 방법을 조롱 할 수있는 방법이 있습니까? 내가 뭔가 잘못하고 있는거야? 양자 택일로, 나는이 매개 변수를 무시할 수 있었다. 그러나 나는 방법을 모르고있다. 난 단지 첫 번째 매개 변수의 값을 테스트해야 ignorearguments 작동하지만 나는 그것을 사용하는 경우이 값을 얻을 수 있는지 또는 어떻게 모르겠어요

+1

'IConector.listar' 메소드 서명을 게시 할 수 있습니까? 어떤 moq 버전을 사용하고 있습니까? 코드를 실행할 때 버전 3.1.416.3이 어떤 오류도 발생시키지 않기 때문입니다. – nemesv

+0

Moq 4.0.10827.0은 'IEnumerable listar (문자열 이름, Estandar estandar, object 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

네, 이것이 완벽하게 작동했습니다. 감사! –