Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过单元测试项目从调用的类库访问App.Config设置_C#_Asp.net_Configuration_Nunit_App Config - Fatal编程技术网

C# 通过单元测试项目从调用的类库访问App.Config设置

C# 通过单元测试项目从调用的类库访问App.Config设置,c#,asp.net,configuration,nunit,app-config,C#,Asp.net,Configuration,Nunit,App Config,我有以下设置: ASP.net 3.5网站项目 具有业务逻辑的C#类库 用于单元测试的C#类库 业务逻辑库执行所有数据库访问。它通过访问System.Configuration.ConfigurationManager.ConnectionString从网站的web.config文件获取连接字符串。当web站点调用该库时,这可以正常工作,因为库会查找调用方的配置 我希望能够通过单元测试类库测试我的业务逻辑。我在测试类库的根目录下放了一个App.config文件。据我所知,当测试库调用作为业务

我有以下设置:

  • ASP.net 3.5网站项目
  • 具有业务逻辑的C#类库
  • 用于单元测试的C#类库
业务逻辑库执行所有数据库访问。它通过访问System.Configuration.ConfigurationManager.ConnectionString从网站的web.config文件获取连接字符串。当web站点调用该库时,这可以正常工作,因为库会查找调用方的配置

我希望能够通过单元测试类库测试我的业务逻辑。我在测试类库的根目录下放了一个App.config文件。据我所知,当测试库调用作为业务逻辑库一部分的数据访问过程时,应该访问并使用测试库App.config文件中的连接设置。但是,当我尝试运行单元测试时,返回的错误表明未成功访问测试库的App.config文件(和/或其内容)

我对配置属性的检索(从业务逻辑库中)如下所示:

public SqlConnection MainConnection {
  get {
    string conn = "";
    try {
      conn = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
    } catch {
      // might be calling from test project. Need to reference app settings
      conn = System.Configuration.ConfigurationManager.AppSettings["connString"];
    }
    return new SqlConnection(conn);
  }
}

当从网站项目调用它时,它会工作。在单元测试中,conn变量从未设置为任何值(我也尝试过System.Configuration.ConfigurationSettings.AppSettings,并使用,而不是使用,结果相同)。当从NUnit GUI中调用时,我需要做什么才能使业务逻辑类库成功检索单元测试类库设置?

尝试WebConfiguration Manager.OpenWebConfiguration()方法

我刚刚找到了解决办法。现在,通过NUnit GUI运行测试时,App.config被正确使用

显然,如果您正在使用NUnit GUI并通过Project>add assembly添加程序集,则它不会访问app.config。但是,如果通过将dll从Windows资源管理器拖动到NUnit GUI,将程序集添加到NUnit项目,则它将访问app.config


或者,您可以通过GUI添加程序集,然后进入NUnit GUI>Project>Edit,并将配置文件名设置为配置文件名(VS会将其设置为.of.your.dll.config),并将项目库设置为项目的\bin\Debug目录(这些是拖动程序集与手动添加程序集时在后台完成的额外步骤。

我建议更改设计,使业务逻辑层(而不是负责查找配置设置)与它们一起注入


您的Web应用程序可以插入从其Web.config文件读取的设置,而您的单元测试可以插入不同的设置(例如,连接字符串到测试数据库等)

只需将
app.config
重命名为
name.of.your.dll.config
。它对我很有用。

NUnit是一条重要的信息,您应该包含在问题中,因为我有您描述的使用Visual Studio测试工具的场景。测试工具从测试中的app.conig读取配置项目。刚刚添加了一个问题,我正在从NUnit GUI调用测试。它应该按照您所描述的那样工作。您确定,您的测试项目的app.config中有所有相关设置吗?您是否可能混淆了AppSettings和ApplicationSettings?您可以发布两个配置文件的相关部分吗?刚刚尝试了这个。WebConfiguration Manager.OpenWebConfiguration需要一个虚拟路径,因为我不是从网站内部调用它,所以我无法提供虚拟路径。我的情况是,在完成了大量工作后,我将单元测试引入到项目中。我已将所有代码从App_代码移动到它自己的独立库中,以便能够使用le需要做单元测试。但在这一点上,依赖项注入有点超出范围。active link:抱歉,我尝试过这么做,但它不起作用,我有控制台应用程序,我只得到了exe文件,没有dll
Configuration config = WebConfigurationManager.OpenWebConfiguration(@"x:\path\web.config");
            KeyValueConfigurationCollection appSettings = config.AppSettings.Settings;
            string connString = appSettings["connString"].Value;