Moq是Web服务的数据源

时间:2016-02-02 19:29:57

标签: c# .net sql-server entity-framework web-services

我正在研究一个相当复杂的多层应用程序,我想模拟其中一个层的数据源,因为它很难在很多时候进入数据库。 (其中有些甚至还不存在。)

我希望能够做的是在其中一个Web服务中设置一个标志,让它使用模拟数据源而不是数据库连接。我只是将数据放在xml文件中。我已经成功地在单元测试中使用了moq,但似乎我无法在运行时使用模拟替换注入的数据库进行精神跳跃。

筹码:

  • VS 2013
  • .Net 4.5.1
  • Ninject
  • 实体框架5?
  • SQL Server 2012
  • 通过SQL Server中的存储过程调用的多个附加数据库
  • Moq 2.x
  • WCF
  • Web API 2

2 个答案:

答案 0 :(得分:1)

不是设置标志,为什么不使用和接口并传递它?例如。 IDataSource

例如,您的网络服务需要IDataSource作为其构建的一部分。

然后,你的moq可以实现界面,你可以传入它,而不是IDataSource真正的实现。同样,您的真实数据库也将实现该接口......

public class MoqDataSource : IDataSource
{
    ...
}

public class RealDatabase : IDataSource
{
    ...
}

对于替换真实数据源,在运行时,您可以使用某种返回IDataSource的工厂类,然后使用任意数量的方法来确定工厂返回的内容。

E.g。工厂读取一些配置文件,根据你在那里设置的内容,它会返回一个真实的数据源,或者moq ......

public class DataSourceFactory
{
    public static IDataSource CreateDataSource()
    {
        if (/* are we using real data source */)
        {
            return new RealDatabase();
        }
        else
        {
            return new MoqDataSource();
        }
    }
}

无论您将其称为 factory 还是其他内容都无关紧要......它只是封装IDataSource创建的一种方式。只有工厂类需要关注您要创建的IDataSource类型,应用程序的其余部分并不必担心。

答案 1 :(得分:0)

恕我直言,最简单的方法可能是使用可以设置依赖关系信息的文件。这样,您可以通过简单的xml文件更改在Moq和实际数据源之间切换(甚至可以使用不同的构建目标驱动它,等等,但这超出了原始问题的范围)。

为了集成Ninject的xml文件以供使用,您需要一个扩展名:

https://github.com/ninject/ninject.extensions.xml

... HTH