存根回显未知输入的函数
本文关键字:函数 输入 未知 存根 | 更新日期: 2023-09-27 17:57:15
我有一个方法,它采用单个方法接口的多个实现并依次执行它们。这些中的每一个都以某种方式突变ValueType
。
public interface IValueTypeMutator
{
ValueType ModifyValueType(ValueType valueType);
}
public class ValueTypeBuilder
{
public ValueType Create(params IValueTypeMutator[] mutators)
{
var valueType = new ValueType { X = "SomeConstant" };
return mutators.Aggregate(
(valueType, mutator) => mutator.ModifyValueType(valueType));
}
}
当我测试一个使用 ValueTypeBuilder
的类时,每个IValueTypeMutator
都将是一个存根。为了在初始化后保持ValueType
的状态,对于某些测试,我希望存根简单地回显ValueType
输入的值作为返回值。
这是必要的,因为如果没有显式的Stub()
实现,存根的默认行为是返回 null
,这将覆盖 Create()
方法中较早的ValueType
初始化。然而,定义ValueType
初始化中使用的实际值会导致测试变得不必要地脆弱:ValueType
的精确初始化与这些特定的测试无关,只是保持其状态。
RhinoMocks Do() Handler 符合这里的要求。
_stubMutator = MockRepository<IValueTypeMutator>();
_stubMutator
.Stub(x => x.ModifyValueType(Arg<ValueType>.Is.Anything))
.Do((Func<ValueType, ValueType>) (v => v));
在这种情况下,ValueType
的精确初始化不是测试的主题,因此我使用了Arg<ValueType>.Is.Anything
来确保无论ValueType
的值如何都调用恒等函数。
我不禁认为雪莉你实际上可以使用假货或真IValueTypeMutator
。使用具体类进行单元测试并没有错。在这种情况下,我会private class FakeValueTypeMutator
进入测试类。它更清楚发生了什么。
[TestFixture]
public ValueTypeBuilderTest
{
private class FakeValueTypeMutator : IValueTypeMutator
{
public ValueType ModifyValueType(ValueType valueType)
{
return valueType;
}
}
//Test code here!
}