存储一个回显未知输入的函数

时间:2014-04-07 16:58:14

标签: c# unit-testing rhino-mocks

我有一个方法,它采用单方法接口的多个实现并依次执行它们。其中每一个都以某种方式改变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,这将覆盖ValueType之前Create()的初始化} 方法。然而,定义ValueType初始化中使用的实际值会导致测试变得不必要地脆弱:ValueType的精确初始化与这些特定测试无关,只是它的状态维持。

2 个答案:

答案 0 :(得分:2)

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来确保调用身份函数,而不管{{1}的值如何}。

答案 1 :(得分:0)

我不禁想到,你真的可以使用假或真实IValueTypeMutator。使用具体类进行单元测试没有任何问题。在这种情况下,我会将private class FakeValueTypeMutator放入测试类。发生的事情要清楚得多。

[TestFixture]
public ValueTypeBuilderTest
{
    private class FakeValueTypeMutator : IValueTypeMutator
    {
        public ValueType ModifyValueType(ValueType valueType)
        {
            return valueType;
        }
    }

    //Test code here!
}