何时在Moq中指定某些设置

时间:2014-12-05 16:28:46

标签: asp.net moq

我正在尝试关注使用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命名空间没有很强的把握。

1 个答案:

答案 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