我似乎无法找到关于此的很多信息,所以我想我会把它放在这里。我经常发现自己遇到的其中一个问题是在处理列表时单元测试单个对象的创建。例如,我会有一个方法签名,如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));
}
}
凭借什么被张贴以上,我可以很容易地测试,我能够创造给予Input
的Output
一个单一实例。请注意,除CompositeCreator
以外,我不需要在代码库中的任何其他地方拨打SingleCreator
。创建ICreator
也会给我重用它的好处,我需要做其他时间做类似的任务,目前我在当前项目中做了2-3次其他时间。
任何人都有这方面的经验可以说明一些情况吗?我只是在推翻这个吗?建议非常感谢。
我不得不承认我不明白你想解决的问题。 – 2013-03-19 13:28:00
这对我来说感觉很主观... – penguat 2013-03-19 14:01:34