【问题标题】:MOQ returning null. [mock concrete class method]最小起订量返回 null。 【模拟具体类方法】
【发布时间】:2012-01-18 10:18:31
【问题描述】:

[使用起订量]

我正在尝试模拟一个具体的类并模拟该类的虚拟方法“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());
        }

    }
}

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

感谢各位前辈!

【问题讨论】:

    标签: unit-testing generics inheritance mocking moq


    【解决方案1】:

    我怀疑这是问题所在:

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

    List&lt;T&gt; 没有实现IQueryable&lt;T&gt;,所以这将总是返回 null。改为调用AsQueryable 进行转换:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 2014-10-23
      • 1970-01-01
      • 2011-09-30
      • 2020-01-21
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多