C#为什么单元测试有这种奇怪的行为?

时间:2010-06-10 15:09:21

标签: c# unit-testing

我有一个类来加密connectionString。

    public class SKM
        {
            private string connStrName = "AndeDBEntities";

        internal void encryptConnStr()
        {
            if(isConnStrEncrypted())
                return;
            ...
        }

        private bool isConnStrEncrypted()
        {
            bool status = false;
            // Open app.config of executable.
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            // Get the connection string from the app.config file.
            string connStr = config.ConnectionStrings.ConnectionStrings[connStrName].ConnectionString;

            status = !(connStr.Contains("provider"));
            Log.logItem(LogType.DebugDevelopment, "isConnStrEncrypted", "SKM::isConnStrEncrypted()", "isConnStrEncrypted=" + status);
            return status;

        } 

   }

以上代码在我的应用程序中运行良好。但不是我的单元测试项目。

在我的单元测试项目中,我测试了encryptConnStr()方法。它将调用isConnStrEncrypted()方法。然后将在此行抛出异常(空指针):

string connStr = config.ConnectionStrings.ConnectionStrings[connStrName].ConnectionString;

我必须使用这样的索引来传递单元测试:

string connStr = config.ConnectionStrings.ConnectionStrings[0].ConnectionString;

我记得几天前我加入了上面的单元测试。但现在它给了我一个错误。单元测试尚未与我们的每日自动构建集成。我们只有一个connectionStr。它适用于产品,但不适用于单元测试。不知道为什么。有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:1)

单元测试项目使用自己的配置文件。连接字符串是否也存在于该文件中?

答案 1 :(得分:0)

config.ConnectionStrings通常会尝试读取执行此代码的进程的app / web.config文件。因此,您可能需要在单元测试项目中添加包含连接字符串的app.config文件。

答案 2 :(得分:0)

我个人建议将你的加密测试方法分成更通用的IsStringEncrypted。

通过这种方式,您可以测试加密方法,而无需担心数据库,连接字符串或web / app.configs。

在您的代码中,您只需致电

String connectionString = GetConnectionStringFromAppConfig(); SKM.IsStringEncrypted(的connectionString);

在单元测试中,您只需为该特定测试定义connectionString。