MOQ返回null。 [模拟具体类方法]

时间:2012-01-18 10:18:31

标签: unit-testing generics inheritance mocking moq

[使用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());
        }

    }
}

断言alays失败..而不是返回SomeClassesTest.Get()

感谢先进的人!

1 个答案:

答案 0 :(得分:7)

我怀疑这是问题所在:

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

List<T>未实现IQueryable<T>,因此始终将返回null。请致电AsQueryable进行转换:

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

顺便说一句,在大多数情况下,这是一个偏好as的演员阵容的理由:如果你刚刚演绎到IQueryable<Abc>,你就会收到一个例外的线路造成这个问题。只有当{em>不是错误才能转换为“失败”时,才应使用asas运算符几乎总是后面都会进行无效性测试。

(请注意,此行为本身与模拟或Moq无关。这只是as运算符的行为...)