gpt4 book ai didi

c# - 如何使用 .Net IO 类创建可测试代码?

转载 作者:太空狗 更新时间:2023-10-29 20:28:36 24 4
gpt4 key购买 nike

我想创建可单元测试的代码来模拟对 .Net System.IO 类的调用,这样我就可以真正地进行单元测试,而不是依赖于文件系统。我正在使用 SystemWrapper类来包装 BCL 类。

我正在尝试获取一个简单的示例来查看文件是否存在。

我遇到的问题是在类中注入(inject)依赖项不起作用,因为实例化依赖项(通过 StructureMap )需要知道要传递的构造函数参数,这在那个时候不可用,也在那里没有默认构造函数。

示例代码:

// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);

// using service locator (anti-pattern?!) since it can't be
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
new ExplicitArguments(new Dictionary<string, object>
{
{"fileName", filename}
}));

Console.WriteLine("File exists? {0}", fileInfoWrap.Exists);

我不喜欢的是没有注入(inject)依赖项,ObjectFactory 不应该在这里(但我看不到其他创建它的方法)。ExplicitArguments 使它变得困惑,参数名称是一个神奇的字符串。

为了让它工作,StructureMap 配置类需要明确知道我想使用哪个构造函数(我刚开始使用 StructureMap,所以这可能不是设置它的正确方法):

ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromPath(".");
scan.RegisterConcreteTypesAgainstTheFirstInterface();
scan.WithDefaultConventions();
});

// use the correct constructor (string instead of FileInfo)
x.SelectConstructor(() => new FileInfoWrap(null as string));

// setting the value of the constructor
x.For<IFileInfoWrap>()
.Use<FileInfoWrap>()
.Ctor<string>("fileName")
.Is(@".");
});

有没有人找到更好的解决方案来创建针对 System.IO 类的可测试代码?我知道部分问题出在 System.IO 类的设计上。

最佳答案

我非常成功地使用了一种方法,即为在 System.IO 和 FCL 的其他部分中找到的类型滚动我自己的代理类型。例如。我想依赖 System.IO.File。我创建了一个名为 System.IO.Proxies 的库,并添加了一个具体类型 File 和一个接口(interface) IFile。接口(interface) IFile 公开的成员等同于我从 System.IO.File 需要的所有成员,具体类型通过将方法调用转发给 来实现这些成员>系统.IO.文件System.IO.Proxies 被排除在单元测试和代码覆盖范围之外。在我的消费程序集中,我只依赖 System.IO.Proxies,具体来说,我只依赖 IFile。通过这种方式,我可以轻松地模拟这种依赖关系,并为我的消费程序集实现 100% 的代码覆盖率。

(请注意,这是我的 more general answer 针对上一个问题的定制版本。)

关于c# - 如何使用 .Net IO 类创建可测试代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768825/

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