【问题标题】:How to implement Count method on Mocked IQueryable object如何在 Mocked IQueryable 对象上实现 Count 方法
【发布时间】:2019-06-09 23:19:07
【问题描述】:

目前,我正在使用以下方法模拟 DbSet:

//Helper Function in another file
public static DbSet<T> MockDbSet<T>(params T[] items) where T : class
            {
                IEnumerable<T> ts = items;
                var mock = new Mock<DbSet<T>>();
                mock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(ts.GetEnumerator());
                return mock.Object;
            }

我使用以下方式调用它:

Answer[] sampleAnswers = new Answer[]
                {
                    new Answer() { Id = 4, QuestionId = 1, SurveyId = 4 },
                    new Answer() { Id = 5, QuestionId = 2, SurveyId = 4 },
                    new Answer() { Id = 6, QuestionId = 3, SurveyId = 4 },
                    new Answer() { Id = 7, QuestionId = 4, SurveyId = 5 }
                };

var mockAnswers = Helper.MockDbSet(sampleAnswers);

context.Setup(c => c.Answers).Returns(mockAnswers);
var count = context.Object.Answers.Count();

当我到达 context.Object.Answers.Count() 时,我得到一个空指针异常。但是,当我在 context.Object.Answers 上运行 foreach 时,我能够很好地得到每个答案。有什么我需要模拟的东西吗?我知道我不能模拟扩展方法。

【问题讨论】:

  • 查看IQueryable&lt;T&gt; 拥有的所有成员。假设该接口的各种消费者都需要它们,因为他们中的大多数都需要它们。测试其中一个成员是否存在并不会改变正在使用其他成员的事实,并且您没有为他们提供定义。
  • 我目前正在尝试设置提供程序、元素和表达式,但我是否需要更改我的辅助函数以期望实现 IQueryable 的类型?我希望将其保留为通用的 IEnumerable 类型..
  • 我明白了。谢谢!
  • 你必须为 mockAnswers 设置 Count 方法。
  • 你不应该把答案放在你的问题中......你可以在答案中回答你的问题或让@Servy去做。

标签: c# entity-framework linq unit-testing moq


【解决方案1】:

Servy 的回答是正确的,我需要将我的通用 DbSet 更改为以下内容并且计数有效:

 public static DbSet<T> MockDbSet<T>(params T[] items) where T : class
    {
        IEnumerable<T> ts = items;
        var mock = new Mock<DbSet<T>>();
        mock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(ts.GetEnumerator());
        mock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(items.AsQueryable().Provider);
        mock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(items.AsQueryable().Expression);
        mock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(items.AsQueryable().ElementType);

        return mock.Object;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多