2012-01-18 6 views
0

[Moq 사용]MOQ가 null을 반환합니다. [모의 콘크리트 클래스 방법]

구체적인 클래스를 조롱하고 해당 클래스의 가상 메서드 "Get()"을 조롱하려고합니다. "GetItemsNotNull()"메서드를 테스트 할 때 나는 조롱 된 함수가 반환되는 대신 항상 null을 반환합니다. 여기


//SomeClasses.cs 
namespace MoQExamples 
{ 
    public abstract class Entity 
    { 

    } 

    public class Abc : Entity 
    { 

    } 

    public interface IRepository<T> where T : Entity 
    { 
     IQueryable<T> Get(); 
    } 

    public class Repository<T> : IRepository<T> where T : Entity 
    { 
     private readonly ISession _session; 

     public Repository() 
     { 
      _session = null; 
     } 

     public Repository(ISession session) 
     { 
      _session = session; 
     } 

     protected ISession CurrentSession 
     { 
      get { return _session; } 
     } 

     public virtual IQueryable<T> Get() 
     { 
      return CurrentSession.Query<T>(); 
     } 

    } 

    public interface IAbcRepository 
    { 
     Abc GetItemsNotNull(); 
    } 

    public class AbcRepository : Repository<Abc>, IAbcRepository 
    { 
     public Abc GetItemsNotNull() 
     { 
      return Get().FirstOrDefault(abc => abc !=null); 
     } 
    } 
} 

여기가 테스트 클래스를 인 코드

namespace MoQExamples 
{ 
    [TestFixture] 
    public class SomeClassesTest 
    { 
     private readonly Mock<AbcRepository> _abcRepositoryMock = new Mock<AbcRepository>(MockBehavior.Strict) { CallBase = true }; 

     [SetUp] 
     public void SetupTest() 
     { 
      _abcRepositoryMock.Setup(x => x.Get()).Returns(Get); 
     } 

     public IQueryable<Abc> Get() 
     { 
      return (new List<Abc>() { new Abc() }) as IQueryable<Abc>; 
     } 

     [Test] 
     public void TestGetItemsNotNull() 
     { 
      Assert.IsNotNull(_abcRepositoryMock.Object.GetItemsNotNull()); 
     } 

    } 
} 

SomeClassesTest.Get를 (반환 어설 alays fails..instead)

선배 들께 감사드립니다!

return (new List<Abc>() { new Abc() }) as IQueryable<Abc>; 

List<T>

IQueryable<T>를 구현하지 않기 때문에이 것 항상는 null :

+0

버전 : 4.0.10827.0 –

답변

7

나는이 문제를 의심. 대신 변환 할 AsQueryable 전화 : 여담으로

return new List<Abc>().AsQueryable(); 

를, 이것은 대부분의 상황에서 as에 걸쳐 캐스트를 선호하는 이유입니다 : 당신은 단지 IQueryable<Abc> 캐스팅하려는 경우, 당신은 라인에서 예외를받은 것 그것은 정말로 문제를 일으켰습니다. 이 아닌 경우에만 as을 사용하고 "실패"로 변환 할 수있는을 사용해야합니다. as 연산자는 이어야하며 거의 항상이어야하며 무효 테스트를 받아야합니다.

(그 자체로이 동작을 조롱 또는 MOQ과 아무 상관이 있습니다 그것은 as 연산자의 바로 행동입니다 ....)

+0

그것이 마치 마법처럼 일했다 :) –

관련 문제