gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:53:10 28 4
gpt4 key购买 nike

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

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

最佳答案

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

关于c# - 单元测试需要读取文件。我如何使它便携?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062034/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com