Nsubstitute:如何在泛型类中创建假

时间:2017-07-19 13:31:15

标签: c# unit-testing generics nsubstitute

我正在使用Nsubstitute进行嘲弄。为了减少代码,我想编写一个伪造泛型属性的泛型类:

public class Tester<TValue>
    where TValue: IValue
{
    // this is used inside the class in other methods
    private TValue CreateValue()
    {
        return Substitute.For<TValue>(); // here the compiler has an error
    }
}

此代码在标记的位置给出了编译错误:

  

'TValue'类型必须是参考类型才能   在泛型类型或方法中将其用作参数“T”   'Substitute.For(params object [])'

这看起来很明显,因为Substitute类的实现如下所示:

public static class Substitute
{
    public static T For<T>(params object[] constructorArguments) where T : class;
}

我想知道的是,为什么这样的代码是可能的:Substitute.For<IValue>()并且不会引发错误。任何人都能解释如何使用伪装来执行泛型类吗?

1 个答案:

答案 0 :(得分:1)

以下代码应该有效:

public class Tester<TValue>
    where TValue : class, IValue
{
    // this is used inside the class in other methods
    private TValue CreateValue()
    {
        return Substitute.For<TValue>(); // here the compiler has an error
    }
}

The type must be a reference type in order to use it as parameter 'T' in the generic type or method可能值得一读。

必要的原因是Substitute.For指定了引用类型(class)。因此,它的任何通用调用者(比如你自己)都需要指定相同的class约束。