我正在制作一个n层架构程序 -
BAL - 业务访问逻辑库,
DAL - 数据访问逻辑 - 库,
设置 - 图书馆,
和主应用程序 - 可执行文件 - asp.net Web表单。
现在,我编写了一个单元测试用例来测试设置库 - 这个库什么都不做,只是从主应用程序web.config
读取连接字符串。
当我调用测试用例时,连接字符串不会被读取。我在这里做错了什么。
来自可执行项目的web.config -
<connectionStrings>
<!-- DataSource is SQLEXPRESS and Catalog is DBNAME-->
<add name="SqlCon" connectionString="Data Source=SHREYAS-PC\SQLEXPRESS;Initial Catalog=SchoolManagementDb;Integrated Security=true"/>
</connectionStrings>
设置库 -
namespace Settings
{
public class Settings
{
public static string ConnectionString()
{
try
{
string Con = ConfigurationManager.ConnectionStrings["SqlCon"].ToString();
return Con;
}
catch(Exception ex)
{
throw;
}
}
}
}
单元测试用例 -
[TestClass]
public class UnitTestSettings
{
[TestMethod]
public void TestMethod1()
{
string con = Settings.Settings.ConnectionString();
Console.WriteLine(con);
}
}
不幸的是,当我运行单元测试用例时,connectionString返回为NULL,而如果我运行整个应用程序,我得到了我想要的结果。 我在这里错过了任何概念吗?
答案 0 :(得分:1)
您的连接字符串位于Web项目中,而不是您的测试项目。
将连接字符串/应用程序设置添加到测试项目app.config,以测试您是否可以正确读取它。
答案 1 :(得分:1)
从启动应用程序或站点的.config
文件中读取配置,在单元测试的情况下,该文件是测试项目的app.config
。将连接字符串移动到那里。
除此之外,测试用例也应该更新。
[TestClass]
public class UnitTestSettings {
[TestMethod]
public void TestMethod1() {
//Arrange
var expected = "Place expected connection string here"
//Act
var actual = Settings.Settings.ConnectionString();
//Assert
Assert.IsNotNull(actual);
Assert.AreEqual(expected, actual);
}
}
除了上述内容之外,我建议重构架构以使用抽象并避免耦合到使测试变得困难的静态类/成员。你已经遵循单一责任原则,这很好。你应该让依赖者依赖于抽象,而不是依赖于实现问题。
例如,抽象设置(服务)
public interface ISettings {
string ConnectionString { get; }
}
这是实施。
public class Settings : ISettings {
public string ConnectionString {
get {
try {
var value = ConfigurationManager.ConnectionStrings["SqlCon"].ToString();
return value;
} catch(Exception ex) {
throw;
}
}
}
}