首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试需要读取文件。我如何使它便携?

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

Stack Overflow用户
提问于 2014-11-21 13:00:34
回答 2查看 151关注 0票数 2

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

代码语言:javascript
复制
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);
        }
    }
}

这是我保证其他开发人员将拥有的路径的一部分。之前的一切我都需要动态地得到。

代码语言:javascript
复制
\RetailCoderVBE\RetailCoder.VBE\Config\rubberduck.config
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 13:24:17

您应该做的是创建一个文件系统的接口,并在测试中模拟它。这个接口的实现访问了您无法测试的实际文件系统,因此它必须尽可能简单。由于XmlSerializer.Deserialize方法接受流,所以您的接口可以返回流。

代码语言:javascript
复制
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));
     }
}

然后测试会是

代码语言:javascript
复制
[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。

票数 3
EN

Stack Overflow用户

发布于 2014-11-21 13:10:34

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

以上强烈表明,这并不是真正的单元测试。他们(理想地)独立于外部世界。为什么需要读取配置文件?配置中存储了哪些信息?也许可以通过测试或存根将带有虚拟信息的配置文件添加到带有某些接口的文件系统中。

这样做的标准方法如下所示

代码语言:javascript
复制
interface IConfigReader{
   object GetValue(string key);
}

// later in code
var configDate = _reader.GetValue("ConnectionString");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27062034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档