繁体   English   中英

单元测试需要读取文件。 如何使它便携?

[英]Unit test needs to read file. How do I make it portable?

我正在与另一个开发人员一起进行开源项目。 我正在进行的单元测试需要读取默认的自定义xml配置文件。 我只能保证回购中路径的一部分将在他的机器上。 如何重写此测试以使其可移植? 我不希望每次我们将代码检入存储库时测试都会开始失败。

public class ConfigurationTests
{
    [TestMethod]
    public void ConfigurationLoads()
    {
        //todo: how do I make this test portable?
        const string configFile = @"C:\Users\Christopher\Source\Repos\RetailCoderVBE\RetailCoder.VBE\Config\rubberduck.config";
        var deserializer = new XmlSerializer(typeof(Rubberduck.Config.Configuration));
        using (StreamReader reader = new StreamReader(configFile))
        {
            Rubberduck.Config.Configuration config = (Rubberduck.Config.Configuration)deserializer.Deserialize(reader);
            Assert.IsNotNull(config);
        }
    }
}

这是我保证其他开发人员将拥有的道路的一部分。 在此之前,我需要以某种方式动态获取所有内容。

\RetailCoderVBE\RetailCoder.VBE\Config\rubberduck.config

您应该做的是创建文件系统的接口并在测试中对其进行模拟。 该接口的实现将访问您无法测试的真实文件系统,因此它必须尽可能简单。 由于XmlSerializer.Deserialize方法接受Stream,因此您的接口可以返回Stream。

public interface IFileAccess
{
     Stream GetFileStream(string fileName);
}

public class RealFileAccess : IFileAccess
{
     public Stream GetFileStream(string fileName)
     {
          ....
     }
}

public class ConfigLoader
{
     Rubberduck.Config.Configuration LoadConfiguration(IFileAccess fileAccess)
     {
          const string configFile = @"C:\Users\Christopher\Source\Repos\RetailCoderVBE\RetailCoder.VBE\Config\rubberduck.config";
          var deserializer = new XmlSerializer(typeof(Rubberduck.Config.Configuration));
        return (Rubberduck.Config.Configuration)deserializer.Deserialize(fileAccess.GetFileStream(configFile));
     }
}

然后测试是

[TestMethod]
public void ConfigurationLoads()
{
    const string configFile = @"C:\Users\Christopher\Source\Repos\RetailCoderVBE\RetailCoder.VBE\Config\rubberduck.config";
    IFileAccess fileAccess = Mock.Of<IFileAccess>();
    // setup fileAccess
    Rubberduck.Config.Configuration config = new ConfigLoader().LoadConfiguration(fileAccess);
    Assert.IsNotNull(config);
    Mock.Get(fileAccess).Verify(fa => fa.GetFileStream(configFile));
}

然后,您甚至可以检查是否使用正确的参数调用了GetFileStream。

我正在进行的单元测试需要读取默认的自定义xml配置文件。

以上强烈暗示这并不是真正的单元测试。 它们(理想情况下)独立于外部世界。 为什么需要读取配置文件? 哪些信息存储在配置中? 也许可以使用测试将带有虚拟信息的配置文件添加到您的项目中,或者使用某些接口将依赖项存根到文件系统中。

一个标准的方法看起来像

interface IConfigReader{
   object GetValue(string key);
}

// later in code
var configDate = _reader.GetValue("ConnectionString");

暂无
暂无

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

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