繁体   English   中英

如何在单元测试中检查目录

[英]How to check directory in unit tests

大家好,我有测试问题。 我有 class

  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>

您可以在测试项目中使用相同的 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"));

根据您的 mocking 框架,您可以在测试中编写以下内容。 (这是最小起订量的语法)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM