我正在尝试关注使用Moq进行测试的this入门示例。我能够在我自己的测试项目中复制这些示例,并且可以让我的测试通过(在我的上下文被注入的地方测试我的服务)。但是,我不明白的是,何时使用以下每个安装调用:
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
有人可以用非常基本的术语解释何时应该使用这些内容?
例如,似乎如果我正在测试的服务中的方法使用表达式,我需要进行上面的第二次设置调用(我通过删除并重新插入这些调用来完成了一些试验和错误)。我去过Moq文档以及Table-TEntity的MSDN,我仍然没有看到它。也许是因为我对Linq命名空间没有很强的把握。
答案 0 :(得分:3)
TL; DR - 使用实体框架DBContext
依赖关系时,您需要在要模拟的任何DBSet
上执行这些设置,特别是返回虚假数据到DBSet上的任何LINQ查询。应该为每个模拟DbSet
完成所有4个设置 - 这可以通过辅助方法一般完成。
更详情:
通常,对于Strict mode off,只有在您实际想要模拟的方法上才需要安装程序。在这种情况下,如果您未对单元测试期间调用的方法执行Setup
,则Moq将为任何未明确{{1}的方法提供默认行为。通常是返回任何预期返回类型的Setup
,对于类,默认值为null,在测试依赖于Mocked EF的类时,它实际上不会有任何帮助{ {1}}。
您提供的具体示例是标准mocked setup for an Entity Framework DbSet
,然后通过从{提供备用default(T)
,您可以为此特定DbSet(DbContext
)提供虚假数据{1}}集合(与通常的具体RDBMS实现相反)。
建议将DbSet<Blog>
模拟代码移动到标准单元测试管道设置框架/工具包中,以创建一个辅助方法,如:
IQueryable<Blog>
然后您可以在模拟List<Blog>
上进行设置,如下所示:
DbSet