c# - 将 Moq C# 代码转换为等效的 c# Microsoft Fakes 以进行单元测试

标签 c# entity-framework unit-testing moq microsoft-fakes

我正在尝试对我最近从事的项目进行单元测试。

它涉及一个 SQL Server 2008 R2 数据库和一个使用 C#、.NET 4.5 和 Visual Studio 2013 Premium 的 WCF 服务。我们使用 Entity Framework (EF) 6.0.1。

我正在尝试使用 Microsoft Fakes 单独测试 WCF,这样它就不需要数据库。我们的目标是使用“内存数据库”来做到这一点。我的困难是“清除”EF 的 dbcontext,因此我知道它处于可以查询、更改和监视的已知状态。

我读到这可能不是个好主意,因为 linq-to-objects 与 linq-to-sql 之间的 Linq 提供程序不同。该功能可能在编译时通过,但在运行时失败。为了解决这个问题,一旦通过 TFS 部署到我们的 DEV 服务器,我们也会进行集成测试(将 WCF 连接到真实数据库)。

我还了解到可以使用 MS FAKES 填充 dbcontext,但感觉不对。

同时添加存储库模式(依赖注入(inject) (DI))不会导致我们的代码覆盖率增加,这是我们期望的结果之一。

然后我找到了这篇文章http://msdn.microsoft.com/en-gb/data/dn314429.aspx和这篇文章 http://frankdecaire.blogspot.co.uk/2013/11/entity-framework-6-mocking-and-unit.html?showComment=1392224065716

这实现了我想做的但使用了最小起订量。此代码可以从 Moq 转换为 MS FAKES 吗? FAKES 是否能够完成 Moq 所做的一切,还是我也应该学习 Moq 以增加我对 FAKES 的有限知识?

var mockSet = new Mock<DbSet<account>>();
mockSet.As<IQueryable<account>>().Setup(m => m.Provider)
       .Returns(data.Provider);
mockSet.As<IQueryable<account>>().Setup(m => m.Expression)
       .Returns(data.Expression);
mockSet.As<IQueryable<account>>().Setup(m => m.ElementType)
       .Returns(data.ElementType);
mockSet.As<IQueryable<account>>().Setup(m => m.GetEnumerator())
       .Returns(data.GetEnumerator());

有什么问题随时问

干杯

凯尔

最佳答案

IMO,您需要通过转向更加分层的方法来开始解耦您的代码。我不太确定您需要通过单独测试 WCF 来实现什么。 我建议有三层和他们的测试如下 -

  1. 数据访问 - 使用 EF 及其数据库上下文并实现数据访问接口(interface)。您应该在不模拟 EF 的数据库上下文的情况下对此进行单元测试。这一层的测试将依赖于“状态”。我的意思是,您的测试将使用真实数据和数据库进行 CRUD 操作。您只需要确保在测试运行后不会将更改持久保存到数据库中。可以使用 Spring.Net 的测试库来实现这一点,或者简单地在事务范围内运行测试并在每次测试运行后回滚事务(在清理中)。

  2. 业务逻辑 - 包含业务逻辑并与数据访问接口(interface)一起工作。使用 spring.net 或 ms unity 等任何 DI 框架来注入(inject)数据访问层。您应该通过尝试避免实际的数据库调用来对此进行单元测试。这就是 NMock、Rhinomock 或 MOQ 之类的东西出现的地方。使用模拟设置边界和异常条件,并确保您的业务逻辑解决所有问题。

  3. WCF 服务层 - 与您一起操作和数据契约。理想情况下,只将调用转发给业务逻辑并将响应转换为数据契约。我更喜欢在这个级别进行两种类型的测试:a) 用于测试翻译和正确调用转移的单元测试。 b) 一些使用代理的基本集成测试和一些在没有任何模拟的情况下遍历整个堆栈的测试数据。

我对 MS fakes 的唯一问题是它附带 VS2012 最终版本,因此与 MOQ 之类的东西相比,它的用户群要少得多。

关于c# - 将 Moq C# 代码转换为等效的 c# Microsoft Fakes 以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21751726/

相关文章:

entity-framework - Entity Framework 6 - GetObjectStateEntries 预期修改的实体具有状态 "Unchanged"

c# - 将 [NotMapped] 添加到部分类是否避免映射整个类?

swift - 使用已发布的结果为 ObservableObject ViewModel 编写单元测试

java - SpringJUnit4ClassRunner 应该初始化它的上下文多少次?

c# - 传递一个 List<T> 和一个 bool

c# - 如何验证IQueryable <T>集合中项目的错误?

c# - 通过反射访问/执行通用方法?

asp.net-mvc-3 - 如何对调用 html.EditorFor 的扩展方法进行单元测试

c# - Quartz.net 的简单工作示例

c# - Task.WhenAll() 一次只执行 2 个线程?