2014-02-13 12 views
4

我正在尝试使用我一直在研究的最近项目进行单元测试。将Moq C#代码转换为等效的c#微软单元测试的假货

它涉及SQL Server 2008 R2数据库和使用C#,.NET 4.5和Visual Studio 2013 Premium的WCF服务。我们使用实体框架(EF)6.0.1。

我想用Microsoft Fakes隔离测试WCF,以便它不需要数据库。我们的目标是使用“内存数据库”来做到这一点。我的困难是“为EF”“dbcontext”dbcontext,所以我知道它处于可以被查询,修改和监视的已知状态。

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

我也读过dbcontext可以使用MS FAKE进行扫描,但只是感觉不对。

此外,添加存储库模式(依赖注入(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()); 

任何问题随时问

干杯

凯尔

+0

如何在DI中使用存储库模式不会增加您的代码覆盖率?如果你想测试你的WCF服务而没有任何额外的依赖关系,你应该使用DI来替换你的单元测试中的依赖关系,使用模拟或存根。 –

+0

@Wouter de Kort,在审查您的评论之后,我重构了我们的代码,将业务逻辑移出资源库类并返回到主WCF服务类。存储库类将通过EF6进行数据操作。我们的代码覆盖率将会增加。我是DI和储存库的新手,所以我认为这样做是错误的。我读过的另一篇博客说,它很难单元测试错误代码,除了缺乏知识之外,这里肯定是这种情况!我仍然倾向于知道是否有人可以回答我的问题,如前所述:-) – Kyle

+0

听起来不错:)我写了一篇关于重构代码的文章,使它更易于测试:http://wouterdekort.blogspot.nl /2012/03/unit-testing-hell-or-heaven.html也许它可以帮助! –

回答

2

IMO,你需要开始迈向一个更加分层的方法移动解耦你的代码。我不太清楚你需要通过单独测试WCF来实现。 我建议具有三个层和它们的测试如下面 -

  1. 数据访问 - 使用EF及其DB上下文并实现了一种数据访问接口。您应该单元测试而不嘲笑EF的数据库上下文。对这个层的测试将是“状态”相关的。我的意思是,您的测试将与CRUD操作的真实数据和数据库一起工作。测试运行后,您只需确保不会将更改保存到数据库中。可以使用Spring.Net的测试库来实现这一点,或者简单地在事务范围下运行测试,并在每次测试运行(清理)后回滚事务。

  2. 业务逻辑 - 包含业务逻辑并与数据访问接口一起使用。使用像spring.net或ms unity这样的任何DI框架来注入数据访问层。您应该通过尝试避免实际的数据库调用来进行单元测试。这就是像NMock,Rhinomock或MOQ这样的东西。使用mock设置边界和异常条件,并确保您的业务逻辑解决所有问题。

  3. WCF服务层 - 适用于您的操作和数据合同。理想情况下,只转发对业务逻辑的调用并转换对数据合同的响应。我更喜欢在这个级别进行两种类型的测试:a)测试翻译和正确的呼叫转移的单元测试。 b)使用代理的一些基本集成测试和一些没有任何嘲弄地贯穿整个栈的测试数据。

我有MS假货唯一的问题是,它附带VS2012旗舰版,因此具有比像一个最小起订量低得多的用户群。