【发布时间】: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<T>拥有的所有成员。假设该接口的各种消费者都需要它们,因为他们中的大多数将都需要它们。测试其中一个成员是否存在并不会改变正在使用其他成员的事实,并且您没有为他们提供定义。 -
我目前正在尝试设置提供程序、元素和表达式,但我是否需要更改我的辅助函数以期望实现 IQueryable 的类型?我希望将其保留为通用的 IEnumerable 类型..
-
我明白了。谢谢!
-
你必须为 mockAnswers 设置 Count 方法。
-
你不应该把答案放在你的问题中......你可以在答案中回答你的问题或让@Servy去做。
标签: c# entity-framework linq unit-testing moq