2010-01-28 2 views
2

~ 1Repository와 같은 일반 클래스를 사용하여 Moq을 통해 Linq 표현을 모의 할 수 있습니까? ~ IRepository는 StructureMap이나 Windsor와 같은 IoC를 통해 주입되는 것입니까? 테스트하려면Moq .GetMock을 사용하여 Linq 표현식으로 ~ 1 개의 직필자를 등록 하시겠습니까?

CODE :

var person = _repository.Find<Person>() 
          .Where(p => p.Id == person.Id).SingleOrDefault(); 

TEST :

var repository = new Mock<IRepository>(); 

    repository.Setup(i => i.Find<Person>() 
        .Where(p => p.Id == person.Id).SingleOrDefault()) 
        .Returns(person).Verifiable(); 

예외 :

System.ArgumentException : A의 잘못된 설정이 아닌 나 mber 방법.. I => i.Find() 여기서 (p => p.Id == "프레드") SingleOrDefault()

용액 Find<T>()

using System.Linq; 
    ... 

    _container.GetMock<IRepository>.Setup(i => i.Find<Person>()) 
        .Returns(new List{person}.AsQueryable()).Verifiable(); 

    ... 

답변

3

경우 확장 방법 IRepository에, 그럼 난 작동하지 않을거야, 왜냐하면 당신은 static 타입을 다루고 있기 때문이다.

에 대한 방법이 Find<T>() 인 경우 repository.Find<Person>()에 대한 반환 값을 설정하십시오. (- 나는 그것이 어떤 모르는이 실제로 반환하도록되어 어느 유형) 및 LINQ 표현은 실제 수업 시간에 그에서 작업을 할 만합니다

Find<>()에 대한 IEnumerable<> 또는 IQueryable<> 반환 할 만듭니다. 프로덕션 환경에서 Entity Framework 또는 LINQ to SQL을 사용하는 경우에도 자체 메서드의 결과를 필터링하기 때문에 LINQ를 모방 할 필요가 없습니다. 대신 전체식이 최적화 된 데이터베이스로 변환됩니다 요구.

설정에서 일치하는 ID가있는 항목을 컬렉션에 제공하면 되돌릴 수 있다고 주장 할 것입니다.
설정에 ID가 일치하는 항목을 제공하지 않으면 null (기본값)이 표시됩니다.
null에서 null을 호출 할 수 없기 때문에 nullrepository.Find<>()에서 반환하는 경우 예외가 발생한다고 주장 할 것입니다.

+0

정말 고맙습니다. 이것은 매력처럼 작동했습니다. – Andrew