如何调用C#库的单元测试用例?

时间:2017-02-25 08:50:48

标签: c# asp.net unit-testing

我正在制作一个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,而如果我运行整个应用程序,我得到了我想要的结果。 我在这里错过了任何概念吗?

2 个答案:

答案 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;
            }
        }
    }
}