最小起订量返回null.[模拟混凝土类方法]



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

感谢先遣队员!

我怀疑这就是问题所在:

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

List<T>不实现IQueryable<T>,因此这将始终返回null。调用AsQueryable将其转换为

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

顺便说一句,这是在大多数情况下更喜欢强制转换而不是as的原因:如果您只是强制转换为IQueryable<Abc>,那么您会在真正导致问题的行中收到一个异常。只有当as不是转换为"失败"的错误时,才应该使用它。as运算符应该几乎总是后面跟着零性测试。

(注意,这种行为本身与mocking或Moq无关。它只是as运算符的行为…)

最新更新