【问题标题】:Private configuration manager field failing on unit test私有配置管理器字段在单元测试中失败
【发布时间】:2021-10-11 00:12:06
【问题描述】:

我有以下代码:

        /// <summary>
        /// Gets the connection string.
        /// </summary>
        private readonly string _connectionString = ConfigurationManager.ConnectionStrings["Database"].ConnectionString;

        /// <summary>
        /// Instantiates a new instance of <see cref="DapperReaderWrapper"/> object.
        /// </summary>
        private readonly IDapperReaderWrapper _dapperReaderWrapper = new DapperReaderWrapper();

        /// <summary>
        /// Retrieves a list of admins from the database.
        /// </summary>
        /// <returns>List of admins.</returns>
        public List<Admin> RetrieveListOfAdmins()
        {
            var adminDatabaseReader = new AdminDatabaseReader(_connectionString, _dapperReaderWrapper);
            return adminDatabaseReader.GetAll();
        }

我正在尝试在底部附近对我的“RetrieveListOfAdmins”方法进行单元测试。这是我的单元测试类:

        private string _connectionString;
        private Mock<IDapperReaderWrapper> _mockDapperReaderWrapper;
        private DatabaseReaderGateway _databaseReaderGateway;

        [TestInitialize]
        public void Initialize()
        {
            _connectionString = DatabaseShared.GetTestingConfigurationFile();
            _mockDapperReaderWrapper = new Mock<IDapperReaderWrapper>();
            _databaseReaderGateway = new DatabaseReaderGateway();
        }

        [TestMethod]
        [TestCategory("Business Test")]
        public void DatabaseReaderGateway_RetrieveListOfAdmins_WhenCallingDatabaseReader_ShouldReturnListOfAdmins()
        {
            // Arrange
            var expectedListOfAdmins = DatabaseShared.MockSetupListOfAdmins();
            SetupMockDapperReaderWrapper("AllAdmins", expectedListOfAdmins);

            // Act
            var actualListOfAdmins = _databaseReaderGateway.RetrieveListOfAdmins();

            // Assert
            Assert.AreEqual(expectedListOfAdmins, actualListOfAdmins, "We were expecting lists to be equal, but they were not.");
            Assert.IsTrue(actualListOfAdmins.Count > 0, "We were expecting a list of admins, but got back zero.");
        }

        /// <summary>
        /// Sets up the dapper reader wrapper and returns a list of items.
        /// </summary>
        /// <typeparam name="T">Generic type item.</typeparam>
        /// <param name="query">Sql Query.</param>
        /// <param name="listOfItems">List of items.</param>
        private void SetupMockDapperReaderWrapper<T>(string query, List<T> listOfItems)
        {
            _mockDapperReaderWrapper.Setup(wrapper => wrapper.Query<T>(It.Is<IDbConnection>(db => db.ConnectionString == _connectionString), query, CommandType.StoredProcedure))
                                    .Returns(listOfItems);
        }

当我尝试运行测试时,我在班级的 ConfigurationManager 上收到以下错误:“对象引用未设置为对象的实例。”

这是我所有解决方案中的 app.config。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="Database" connectionString="Data Source=DESKTOP-IKINKC8\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True;" />
    </connectionStrings>
</configuration>

这是我为我的测试项目获取连接字符串的代码:

        /// <summary>
        /// Gets the configuration file for testing projects.
        /// </summary>
        /// <returns>Connection string.</returns>
        public static string GetTestingConfigurationFile()
        {
            ExeConfigurationFileMap configFileMap = new()
            {
                ExeConfigFilename = "App.config"
            };

            var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

            var section = (ConnectionStringsSection)config.GetSection("connectionStrings");
            var connectionStringCollection = section.ConnectionStrings;

            var connectionString = string.Empty;
            foreach (var connection in connectionStringCollection)
            {
                if (!connection.ToString().Contains("DESKTOP"))
                {
                    continue;
                }

                connectionString = connection.ToString();
            }

            return connectionString;
        }

有人知道为什么会这样吗?我的测试项目以及包含我的类的项目中有一个 app.config。

【问题讨论】:

  • 测试项目中有配置吗?
  • 这可能是以下几个问题之一:您没有将 app.config 添加到您的测试项目中。您没有在 app.config 中添加连接字符串。
  • 我的所有项目中都有 app.configs,并且连接字符串也在所有项目中。 @AkshayBheda

标签: c# .net database unit-testing connection-string


【解决方案1】:

可能是以下问题之一:

  • 您没有将 app.config 添加到您的测试项目中。
  • 您没有在 app.config 中添加连接字符串。

【讨论】:

  • 我的所有项目中都有 app.configs,并且连接字符串也在所有项目中。 @AkshayBheda
  • 你能分享一下配置部分吗?和来自 GetTestingConfigurationFile 的代码
  • 您正在寻找的更新已添加。 @Akshay Bheda
猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多