可以';t在测试具有主机类型“t”时访问来自配置文件的信息;鼹鼠”;

本文关键字:访问 鼹鼠 信息 配置文件 类型 测试 可以 主机 | 更新日期: 2023-09-27 18:22:11

当单元测试的主机类型为"Moles"时,我们在通过单元测试访问.net配置文件(如app.config和web.config)中的信息时遇到问题。它会让人头疼,所以我希望有人知道该怎么办。

我们使用的是Visual Studio 2010,我相信我们已经在安装了VS 2010 SP1的计算机和未安装SP1的计算机上进行了尝试,也在32位和64位的计算机上尝试过。

我冒昧地将测试简化为最简单的术语。通过编写一个由以下两个文件组成的单元测试项目,并在取消注释唯一一行后运行测试,可以重新创建问题。测试在没有主机类型的情况下工作,但当您将Moles引入为主机类型时,测试中的null断言将失败。我们不确定原因。

首先,配置文件App.config:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="Connection" connectionString="Something" />
  </connectionStrings>
</configuration>

接下来,包含单个测试的测试类:

namespace TestProject
    {
    using System.Configuration;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    [TestClass]
    public class UnitTest
        {
        [TestMethod]
        //[HostType("Moles")]
        public void TestMethod()
            {
            var data = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            Assert.IsNotNull(data.ConnectionStrings.ConnectionStrings["Connection"]);
            }
        }
    }

如果有人能提供任何见解,我将不胜感激。

非常感谢

Nick

可以';t在测试具有主机类型“t”时访问来自配置文件的信息;鼹鼠”;

我不确定它是否能完成这项工作,但你可以尝试这个解决方法:使用文件映射打开配置。代码将如下所示:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = configurationFilePath;
System.Configuration.Configuration configuration =
    ConfigurationManager.OpenMappedExeConfiguration(
        fileMap,
        ConfigurationUserLevel.None);

任何时候执行单元测试时,应用程序和用户设置都应该通过依赖项注入传递。这是通过为设置创建一个Stub来完成的,这很容易做到

  1. 在正在测试的项目中创建一个接口,该接口包括每个配置设置的属性。让我们称之为"ISettings",以供参考。

  2. 在实现接口的目标程序集中创建一个存根(类)。存根中的每个属性应该只包含一个get,该get从配置文件中返回相应的设置。我们将把这个存根称为"SettingsStub"。此存根由生产环境中的目标程序集使用。

  3. 将ISettings类型的参数添加到目标类型(正在测试的类)构造函数。目标类中的字段必须设置为传递给构造函数的ISettings对象。根据某些设计模式(MVVM等)的要求,您可以创建一个重载构造函数,并保留默认构造函数。默认构造函数(没有参数的构造函数)可以简单地实例化一个新的SettingsStub,用于生产测试必须始终使用重载构造函数

  4. 为测试项目创建一个设置存根,该存根还实现ISettings。我们将把它称为TestSettingsStub。这个存根包含大多数测试都可以接受的硬编码值。

  5. 重建目标和测试项目。Moles生成一个名为SISettings的Stub类型。

当您不需要调整任何设置值时,请使用具体的TestSrtyingsStub。或者,当需要为一个或两个测试调整值时,使用Miles Stub类型。Moles Stub类型的目的是避免需要制作包含一个或两个独特更改的许多Stub。

调用重载构造函数时,SettingsStub、TestSettigsStub和SISettings类型可以互换使用。现在,您可以完全控制在每个上下文中使用的设置,而无需在测试期间切换逻辑或手动更改设置值。目标代码只是从本地字段中检索设置值,而不是直接从配置文件中检索。请参阅依赖注入和控制反转(IOC)主题。

与往常一样,为了安全起见,您的开发工作站开发无法访问生产网络上的外部依赖系统(数据库等)

编码快乐!

我同意Mike的回答在逻辑上是正确的(即,您没有将配置加载与类分离-可能),实际问题是,对于Moles主机类型,根据您最初的问题,您需要Mole对配置系统的调用,例如

 MConfigurationManager.AllInstances.OpenExeConfiguration (... finish your moleing here...)

语法是近似的——我不记得在这种情况下,你最终是使用SConfigurationManager还是MConfigurationManager。

我完全不同意Mike的观点,即"……开发工作站无法访问外部依赖系统……"这句话是彻头彻尾的可怕建议。我们把这些东西称为集成测试。

是的,作为开发人员,你应该创建它们。在某个时刻,您将编写涉及具体实现的代码(例如,数据库、支持服务等),如果您没有测试这种交互,那么您几乎做错了。