【问题标题】:How to check directory in unit tests如何在单元测试中检查目录
【发布时间】:2020-11-09 14:02:44
【问题描述】:

大家好,我的测试有问题。 我有课

  public class RepositoryWorker
    {
        public IRepository Repository { get;}
        private string _path;
        public RepositoryWorker(IRepository repository)
        {

            if (repository is XmlRepository)
            {
                Repository = repository;
                CheckDirectoryForXMl();
            }

            if (repository is JsonRepository)
            {
                Repository = repository;
                CheckDirectoryForJson();
            }
        }

        public void WriteConfig(Config config)
        {
            Repository.WriteConfig(config,_path);
        }

        public Config ReadConfig(string path)
        {
            return Repository.ReadConfig(path, _path);
        }

        private void CheckDirectoryForXMl()
        {

            _path = Path.Combine(Directory.GetCurrentDirectory(),
                ConfigurationManager.AppSettings.Get("XmlConfigPath"));
            var directory = new DirectoryInfo(_path);
            if (!directory.Exists)
            {
                directory.Create();
            }
        }

        private void CheckDirectoryForJson()
        {
            _path = Path.Combine(Directory.GetCurrentDirectory(), ConfigurationManager.AppSettings.Get("JsonConfigPath"));
            var directory = new DirectoryInfo(_path);
            if (!directory.Exists)
            {
                directory.Create();
            }
        }
    }

我有一个变量路径,它从当前目录和 app.config 中获取一个值,但在测试中我得到 null,因为我无法从配置中获取这个路径我该如何解决这个问题

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key ="XmlConfigPath" value ="XmlConfigs"/>
        <add key ="JsonConfigPath" value ="JsonConfigs"/>
    </appSettings>
</configuration>

【问题讨论】:

  • 您正在组合两个字符串 1) Directory.GetCurrentDirectory() 2) ConfigurationManager.AppSettings.Get("XmlConfigPath") 检查两个字符串(以及组合的字符串)以查看路径是否有效。路径可以是相对的或绝对的。如果相对路径的起始位置是应用程序可执行文件所在的文件夹(如调试或发布文件夹)。

标签: c# unit-testing dependency-injection mocking


【解决方案1】:

您可以在测试项目中使用相同的 appsettings 或不同的测试值创建一个 app.config 文件。

然而,更好的方法是创建一个接口来访问您的设置并使用依赖注入将其注入您的代码中。

然后,在您的单元测试中,您可以为您的界面创建一个 Mock 并设置所需的值。

示例:

public interface ISettings
{
   string GetValue(string name);
}

public class Settings : ISettings
{
   public string GetValue(string name) => ConfigurationManager.AppSettings.Get(name);
}

// Use ISettings the same as you use IRepository
_path = Path.Combine(Directory.GetCurrentDirectory(), _settings.GetValue("JsonConfigPath"));

根据您的模拟框架,您可以在测试中编写以下内容。 (这是 Moq 的语法)

var settingsMock = new Mock<ISettings>();
settingsMock.Setup(x => x.GetValue(It.IsAny<string>())
   .Returns("Your test value");

【讨论】:

  • 对不起这个愚蠢的问题,但是我需要在主项目或测试项目中创建接口吗?
  • 在主项目中,由于您想针对接口进行编程,因为 ConfigurationManager 是您无法模拟的依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多