我似乎找不到太多关于这方面的信息,所以我想我会在这里提出来。我经常发现自己遇到的问题之一是在处理列表时对单个对象的创建进行单元测试。例如,我有一个方法签名,例如IEnumerable<Output> Process(IEnumerable<Input> inputs)
. 当对单个输入进行单元测试时,我会创建一个输入列表并简单地调用First()
结果并确保它是我期望的。这将导致诸如:
public class BatchCreator
{
public IEnumerable<Output> Create(IEnumerable<Input> inputs)
{
foreach (var input in inputs)
{
Console.WriteLine("Creating Output...");
yield return new Output();
}
}
}
我目前的想法是,也许一个类应该负责创建对象,而另一个类负责编排我的输入列表。请参见下面的示例。
public interface ICreator<in TInput, out TReturn>
{
TReturn Create(TInput input);
}
public class SingleCreator : ICreator<Input, Output>
{
public Output Create(Input input)
{
Console.WriteLine("Creating Output...");
return new Output();
}
}
public class CompositeCreator : ICreator<IEnumerable<Input>, IEnumerable<Output>>
{
private readonly ICreator<Input, Output> _singleCreator;
public CompositeCreator(ICreator<Input, Output> singleCreator)
{
_singleCreator = singleCreator;
}
public IEnumerable<Output> Create(IEnumerable<Input> inputs)
{
return inputs.Select(input => _singleCreator.Create(input));
}
}
通过上面发布的内容,我可以轻松测试我是否能够创建一个Output
给定的Input
. 请注意,除了 from 之外,我不需要调用SingleCreator
代码库中的任何其他位置CompositeCreator
。创建ICreator
还可以让我在需要执行类似任务的其他时间重复使用它,我目前在当前项目中执行 2-3 次
有没有人有这方面的经验可以提供一些启示?我只是想太多了吗?非常感谢您的建议。