【问题标题】:How to use web.config when unit testing an asp .net application如何在对 asp .net 应用程序进行单元测试时使用 web.config
【发布时间】:2010-10-05 16:46:36
【问题描述】:

我从单元测试开始,我有一个使用 web.config 作为连接字符串的方法。

我希望能够使用

[DeploymentItem("web.config")]

要获取网络配置文件,这仍然会给我留下空引用异常(这就是我编写下一个测试的目的)。

如何使用我要测试的项目中包含的配置文件?

我正在使用 VS 2008 中包含的测试框架,如果这有什么不同的话。

谢谢

【问题讨论】:

  • 您是否将您的单元测试代码与您的应用程序代码放在同一个项目中?
  • +1,我今天也有同样的问题。遗憾的是我仍然找不到我正在寻找的答案,因为我想做的是在我的网络应用程序中添加一个指向当前 web.config 的链接,并在我编写代码时使用这些值,否则,添加一个 app.config因为我的测试不会测试我的 Web 应用程序配置,这是我在开发应用程序时想要测试的信息的一部分。但是,不要将测试与代码混在一起是有道理的,但有时这很难做到。

标签: .net asp.net unit-testing


【解决方案1】:

单元测试项目应该有自己的配置文件。

在测试项目中,您可以选择添加、新建项目、应用程序配置文件。

此文件的行为与 web.config 完全相同,但用于您的单元测试。

【讨论】:

  • 我已经尝试了你的建议,我在我的测试项目中添加了一个新的配置文件。连接字符串就位,但是在运行我的测试时,我总是在 var sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServer"].ConnectionString); 行上看到 null我可能会错过什么?
  • FWIW,我发布了对类似问题的回复(stackoverflow.com/a/47355610/183174)[here]。要点是您可以让 VS 覆盖在构建测试项目时复制的配置文件。
【解决方案2】:

您会希望结果明确且可重复。为此,您需要处理已知数据,以便您可以清楚地定义正常情况和边界情况。在我的工作中,始终是一个特定的服务器和数据集,因此单元测试模块内置了连接字符串。其他人更喜欢使用单元测试项目之外的连接字符串。我从未见过有人推荐使用网站的配置文件! (开发或其他)

【讨论】:

  • 这很有意义,那么将连接字符串放入我的应用程序进行测试的解决方案是什么?
  • 硬编码特定于您的测试环境的连接字符串(这有一种难闻的味道,但它确实非常实用,因为它与可部署代码无关)或者按照 Gerrie 的建议使用专门为您的单元测试模块定义的配置文件。
  • 只是强调一下:我并不是建议您永远在将要部署的代码中硬编码数据库连接字符串!我在特定服务器上有一个特定的数据库,我总是将其用于单元测试。在测试之前,我运行了一个脚本来确保数据库处于适当的状态。
【解决方案3】:

如果您需要一个连接字符串,那么您不是在编写单元测试(假设您正在使用连接字符串来访问数据库)。单元测试不应该与外部环境交互。您需要在每次签入后都运行它们,以便它们以光速运行。

对于单元测试,您需要将代码与数据库隔离开来。修改你的测试(以及你正在测试的代码,如果需要的话),这样你就不需要去数据库来测试它们了。

【讨论】:

  • 那么你是不是建议我不要测试任何访问数据库的代码?
  • 没有。您的代码必须从不访问数据库(除非您正在编写数据库框架)。相反,您将一个对象传递给您的代码,该代码访问数据库。在您的单元测试中,您模拟该对象,在生产中,您使用实际的数据库访问类。
  • 我只是从根本上完全不同意这一点。它使单元测试脱离了用于改进代码的实用、动手工具的领域,并将其转变为被人为边界包围的抽象。
  • 数据库功能可以通过集成测试来测试,而不是单元测试。您可以将这些与单元测试分开,以便在每次签入后运行单元测试,并在每次每日构建后或您需要时运行集成测试。
  • 我必须同意 Mark Brittingham 的观点。我知道纯粹主义者会说您需要模拟数据,但是如果您的大部分代码都在迭代从数据库返回的数据集行怎么办?如果您有一个模拟对象,那么您只是在测试仅为单元测试目的而编写的“虚构”代码。
【解决方案4】:

将您的 web.config 文件复制到“/bin”文件夹并将其重命名为“AppName.dll.config”。

其中“AppName” - 是生成的程序集的名称。

我多次使用这个技巧。

【讨论】:

  • 它对我不起作用。单元测试不会自动知道配置文件中的 ConnectionString。我必须编写一些自定义代码才能从配置中读取它。
  • 像在接受的答案中那样添加一个简单的 app.config 在大多数情况下应该可以工作。这是一些奇怪配置的 hack(比如 TestDriven 中的“ad-hoc test”)
  • 它在测试项目的 .proj 文件中使用以下设置对我有用:$(TargetFileName)。配置 PreserveNewest 谢谢
【解决方案5】:

您可以使用OpenMappedExeConfiguration 从任何位置加载 web.config 或 app.config。确保将System.Configuration 添加到项目的引用中。

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap()
fileMap.ExeConfigFilename = @"c:\my-web-app-location\web.config"

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
string connectionString = config.AppSettings.Settings["ConnectionString"].Value;

这是 web.config,非常标准。

<?xml version="1.0"?>
<configuration>
  <configSections>
  </configSections>
  <appSettings>
    <add key="ConnectionString" value="Data Source=XXXX;Initial Catalog=XXX; Trusted_Connection=True;"/>
  </appSettings>
</configuration>

2017-09-29 更新

我已经开设了一门课程,可以更轻松地从文件中读取 AppSetitngs。我是从Zp Bappi 那里得到这个想法的。

public interface IAppSettings
{
    string this[string key] { get; }
}

public class AppSettingsFromFile : IAppSettings
{
    readonly Configuration Config;

    public AppSettingsFromFile(string path)
    {
        var fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = path;
        Config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
    }

    public string this[string key]
    {
        get
        {
            return Config.AppSettings.Settings[key].Value;
        }
    }
}

这里是如何使用这个类。

IAppSettings AppSettings = new AppSettingsFromFile(@"c:\my-web-app-location\web.confg");
string connectionString = AppSettings["ConnectionString"];

【讨论】:

    【解决方案6】:

    我建议将配置读取部分抽象化,以便对其进行模拟。类似这样的,见 Jon_Lindeheim 的回复How to read Web.Config file while Unit Test Case Debugging?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多