Dependency injection 在开发中测试web应用程序时模拟外部web服务的最佳方法

Dependency injection 在开发中测试web应用程序时模拟外部web服务的最佳方法,dependency-injection,structuremap,integration-testing,Dependency Injection,Structuremap,Integration Testing,目前我正在开发一个依赖于大量外部web服务的应用程序。其中一些是authorize.net和chargifi 在测试(手动测试)除与这些web服务集成之外的其他内容时,我会将这些web服务依赖项替换为它们的伪版本,而这些版本实际上没有任何作用。我目前的做法是在structure map registry类中使用以下代码行: For<IChargifyService>().Use<MockChargifyService>(); //uncomment this li

目前我正在开发一个依赖于大量外部web服务的应用程序。其中一些是authorize.net和chargifi

在测试(手动测试)除与这些web服务集成之外的其他内容时,我会将这些web服务依赖项替换为它们的伪版本,而这些版本实际上没有任何作用。我目前的做法是在structure map registry类中使用以下代码行:

    For<IChargifyService>().Use<MockChargifyService>(); //uncomment this line to use a mock chargify service
For().Use()//取消对此行的注释以使用模拟chargify服务
我在注册表中有类似的行,用于其他假冒服务。我在部署时将它们注释掉,以便在生产中使用真正的服务。真实和虚假的服务实现都存在于
基础架构
程序集中


这种方法的问题是,我必须记住在部署之前取消对行的注释。我知道有一种方法可以使用结构Xml配置来实现这一点,但我想知道是否有更好的方法来实现这一点。创建
模拟基础架构
程序集是个好主意吗?

看看()。

我可以想到以下几种方法:

1) 您可以按照建议创建一个单独的程序集,其中包含所有模拟实现。您还将在该程序集中包含一个注册表,该注册表将模拟实现设置为默认值。主程序集中的注册表必须进行扫描,以便有选择地加载模拟程序集-类似于:

Scan(x =>
{
    x.TheCallingAssembly();
    x.AssembliesFromApplicationBaseDirectory();
    x.LookForRegistries();
});
2) 另一个选项是为模拟创建配置文件:

Profile("Test", x =>
{
    x.For<IChargifyService>().Use<MockChargifyService>();
    // etc.
});
基于某些环境条件,表明您处于测试模式。

谢谢:)我正在考虑使用配置文件选项,它看起来是最灵活的选项。
ObjectFactory.Profile = "Test";