可以';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
我不确定它是否能完成这项工作,但你可以尝试这个解决方法:使用文件映射打开配置。代码将如下所示:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = configurationFilePath;
System.Configuration.Configuration configuration =
ConfigurationManager.OpenMappedExeConfiguration(
fileMap,
ConfigurationUserLevel.None);
任何时候执行单元测试时,应用程序和用户设置都应该通过依赖项注入传递。这是通过为设置创建一个Stub来完成的,这很容易做到
-
在正在测试的项目中创建一个接口,该接口包括每个配置设置的属性。让我们称之为"ISettings",以供参考。
-
在实现接口的目标程序集中创建一个存根(类)。存根中的每个属性应该只包含一个get,该get从配置文件中返回相应的设置。我们将把这个存根称为"SettingsStub"。此存根由生产环境中的目标程序集使用。
-
将ISettings类型的参数添加到目标类型(正在测试的类)构造函数。目标类中的字段必须设置为传递给构造函数的ISettings对象。根据某些设计模式(MVVM等)的要求,您可以创建一个重载构造函数,并保留默认构造函数。默认构造函数(没有参数的构造函数)可以简单地实例化一个新的SettingsStub,用于生产测试必须始终使用重载构造函数
-
为测试项目创建一个设置存根,该存根还实现ISettings。我们将把它称为TestSettingsStub。这个存根包含大多数测试都可以接受的硬编码值。
-
重建目标和测试项目。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的观点,即"……开发工作站无法访问外部依赖系统……"这句话是彻头彻尾的可怕建议。我们把这些东西称为集成测试。
是的,作为开发人员,你应该创建它们。在某个时刻,您将编写涉及具体实现的代码(例如,数据库、支持服务等),如果您没有测试这种交互,那么您几乎做错了。