MOQ возвращается ноль.[макет метода конкретного класса] - PullRequest
0 голосов
/ 18 января 2012

[используя Moq]

Я пытаюсь смоделировать конкретный класс и смоделировать виртуальный метод "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 ()

спасибо за продвижение, ребята!

1 Ответ

7 голосов
/ 18 января 2012

Я подозреваю, что это проблема:

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

List<T> не реализует IQueryable<T>, поэтому всегда вернет ноль.Позвоните AsQueryable, чтобы преобразовать его вместо этого:

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

Кроме того, это причина, по которой вы предпочитаете кастовать больше as в большинстве ситуаций: если вы просто бросилиIQueryable<Abc>, вы получили бы исключение на линии, которая действительно вызывала проблему.Вы должны использовать as только тогда, когда не является ошибкой для преобразования в "fail".Оператор as должен почти всегда сопровождаться тестом на недействительность.

(Обратите внимание, что это поведение само по себе не имеет ничего общего с насмешками или Moq. Это просто поведение as оператор ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...