无法通过集成测试中的连接管理器访问App.Config

时间:2018-02-22 23:47:52

标签: c# integration-testing

我已经在ConnectionManager类周围创建了一个包装器。此类有两种访问AppSettings和ConnectionStrings的方法。测试的原因是因为我在应用程序设置周围有一个默认值的逻辑。

我的项目是一个类库,它有一个App.config文件,连接字符串和应用程序设置。尝试访问ConfigurationManager时,它会为两者返回null。我正在使用XUnit nuget包FluentAssertions进行测试。我正在使用ReSharper作为我的测试运行员。

我已经阅读了几个关于单元测试和模拟的问题。这是一个集成测试。它旨在实际测试外部依赖关系。

App.Config中

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <clear />
    <add name="TestConnectionString" connectionString="Sample Connection String" />
  </connectionStrings>

  <appSettings>
    <add key="TestAppSetting" value="Sample App Setting"/>
  </appSettings>
</configuration>

包装类(CUT)

public class ConfigurationRepositoryImpl : IConfigurationRepository {
    public string GetConnectionString(string key) {
        return ConfigurationManager.ConnectionStrings[key].ConnectionString;
    }

    public string GetValue(string key, string defaultValue) {
        return ConfigurationManager.AppSettings[key] ?? defaultValue;
    }
}

整合测试

using FluentAssertions;
using Xunit;

namespace MyIntegrationProject {
public class ConfigurationRepositoryTests {
    private static ConfigurationRepositoryImpl MakeRepo() {
        return new ConfigurationRepositoryImpl();
    }

    public class GetConnectionString {
        [Fact]
        public void GoodConnectionName_ReturnsExpectedValue() {
            // arrange
            //var repo = MakeRepo();
            var key = "TestConnectionString";
            var expected = "Sample Connection String";

            // act
            var test = System.Configuration.ConfigurationManager.ConnectionStrings[key].ConnectionString;
            //var test = repo.GetConnectionString(key);

            // assert
            test.Should()
                .Be(expected);
        }

    }
}}

1 个答案:

答案 0 :(得分:0)

为了让我在等待答案时保持活动,我将这个课程变成了更多的接缝,正如Roy {{{{{{{{{{{}}所讨论的那样。这肯定会破坏集成测试的想法,但确实可以通过测试来获得代码。

包装类(CUT)

public class ConfigurationRepositoryImpl : IConfigurationRepository {
    #region attributes
    private static NameValueConfigurationCollection _connectionString;
    private static NameValueConfigurationCollection _values;
    #endregion


    public string GetConnectionString(string key) {
        string retVal = null;

        if (_connectionString == null ||
            _connectionString.Count == 0) {
            retVal = ConfigurationManager.ConnectionStrings[key].ConnectionString;
        } else {
            retVal = _connectionString[key].Value;
        }

        return retVal;
    }

    public string GetValue(string key, string defaultValue) {
        string retVal = null;

        if (_values == null ||
            _values.Count == 0) {
            retVal = ConfigurationManager.AppSettings[key] ?? defaultValue;
        } else {
            retVal = _values[key].Value ?? defaultValue;
        }

        return retVal;
    }

    public static void ResetConnectionStrings() {
        _connectionString = null;
    }

    public static void ResetValues() {
        _values = null;
    }

    public static void SetConnecitonString(string key, string connectionString) {
        if (_connectionString == null) {
            _connectionString = new NameValueConfigurationCollection();
        }

        _connectionString.Add(new NameValueConfigurationElement(key, connectionString));
    }

    public static void SetValue(string name, string value) {
        if (_values == null) {
            _values = new NameValueConfigurationCollection();
        }

        _values.Add(new NameValueConfigurationElement(name, value));
    }
}

更新测试

public class ConfigurationRepositoryTests {
    private static ConfigurationRepositoryImpl MakeRepo() {
        return new ConfigurationRepositoryImpl();
    }

    public class GetConnectionString {
        [Fact]
        public void GoodConnectionName_ReturnsExpectedValue() {
            // arrange
            var repo = MakeRepo();
            var key = "TestConnectionString";
            var expected = "Sample Connection String";

            // act
            ConfigurationRepositoryImpl.SetConnecitonString("TestConnectionString", "Sample Connection String");

            var test = repo.GetConnectionString(key);

            ConfigurationRepositoryImpl.ResetConnectionStrings();

            // assert
            test.Should()
                .Be(expected);
        }

        [Fact]
        public void BadConnectionName_ThrowsNullReferenceException() {
            // arrange
            var repo = MakeRepo();
            var key = "BadKeyName";

            // act
            Action act = () => {
                             repo.GetConnectionString(key);
                         };

            // assert
            act.Should()
               .Throw<NullReferenceException>();
        }
    }

    public class GetValue {
        [Fact]
        public void GoodKey_ReturnsExpectedValue() {
            // arrange
            var repo = MakeRepo();
            var key = "TestAppSetting";
            var expected = "Sample App Setting";

            // act
            ConfigurationRepositoryImpl.SetValue("TestAppSetting", "Sample App Setting");

            var test = repo.GetValue(key, null);

            ConfigurationRepositoryImpl.ResetValues();

            // assert
            test.Should()
                .Be(expected);
        }

        [Fact]
        public void BadKeyWithNullDefaultValue_ReturnsNull() {
            // arrange
            var repo = MakeRepo();
            var key = "BadKeyName";

            // act
            var test = repo.GetValue(key, null);

            // assert
            test.Should()
                .BeNull();
        }

        [Fact]
        public void BadKeyWithGoodDefaultValue_ReturnsDefaultValue() {
            // arrange
            var repo = MakeRepo();
            var key = "BadKeyName";
            var defaultValue = "Good Value";
            var expected = "Good Value";

            // act
            var test = repo.GetValue(key, defaultValue);

            // assert
            test.Should()
                .Be(expected);
        }
    }
}