【问题标题】:Moq a data source for a web serviceMoq 是 Web 服务的数据源
【发布时间】:2016-02-02 19:29:57
【问题描述】:

我正在开发一个相当复杂的多层应用程序,我想模拟其中一层的数据源,因为它在大部分时间都很难访问数据库。 (其中一些甚至还不存在。)

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

堆栈:

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

【问题讨论】:

  • 为你的接口创建一个模拟实现并将其注册到ninject。在模拟实现中读取您的 XML 文件。
  • Eugene S.:这是描述我想要弄清楚如何做的一种简洁明了的方式。

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


【解决方案1】:

与其设置一个标志,为什么不使用和接口并传递它呢?例如。 IDataSource.

例如,您的网络服务将IDataSource 作为其构造的一部分。

然后,您的起订量可以实现该接口并且您可以将其传入,而不是IDataSource真实 实现。同样,您的真实数据库也将实现该接口...

public class MoqDataSource : IDataSource
{
    ...
}

public class RealDatabase : IDataSource
{
    ...
}

至于替换真实数据源,在运行时,你可以使用某种返回IDataSource的工厂类,然后使用任意数量的方法来决定工厂返回什么。

例如工厂读取一些配置文件,根据您在那里设置的内容,它要么返回真实数据源,要么返回最小起订量...

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

不管你称它为 factory 还是别的什么...这只是封装IDataSource 创建的一种方式。只有工厂类需要关心你要创建什么类型的IDataSource,应用程序的其余部分不必担心。

【讨论】:

    【解决方案2】:

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

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

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

    HTH...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多