编程语言
首页 > 编程语言> > c#-具有与AutoFixture’With’等效的匿名值的广义Func包装

c#-具有与AutoFixture’With’等效的匿名值的广义Func包装

作者:互联网

在基于AutoFixture的测试中,我试图尽可能简洁地表达以下内容:

当我通过< input>到此方法的参数x,匿名填写其他参数,结果是…

以工厂方法为例:

class X
{
    public static X Create( Guid a, Guid b, Guid c, String x, String y);

我试图表达为一系列简洁的测试:

>如果我为x传递null,它应该抛出
>如果我为y传递null,它应该抛出

为了表达我可以说:

var fixture = Fixture();
var sut = default( Func<Guid, Guid, Guid,string,X>);
sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonY ) => 
    x =>
        X.Create( anonA, anonB, anonC, x, anonY ) );

Assert.Throws<ArgumentNullException>( () => sut( null));

对于第二个实例,这只是稍有不同,我需要这样做:

var fixture = Fixture();
var sut = default( Func<Guid, Guid, Guid,string,X> );
sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonX ) => 
    y =>
        X.Create( anonA, anonB, anonC, anonX, y ) );
Assert.Throws<ArgumentNullException>( () => sut( null));

对于属性,在AutoFixture中有With.方法(和/或ctor)参数是否等效?

PS0.对于这种情况,我不介意是否有必要进入“魔术”字符串-即,将x位设置为“ x”.

PS 1.房间中的另一头大象是让我对Get in AutoFixture的4倍过载感到震惊-还是因为我在这种环境中使用的是旧版本?

PS2.对于如何对此建模,也可以提出更好的建议-只要它们处理以下事实:我希望它是方法调用而不是属性或字段(并且我希望它可以在AutoFixture样式中工作) ).

解决方法:

AutoFixture中确实没有任何功能可以使此操作更容易,但是我愿意提出建议.但是,我看不到如何用强类型的方式表达这样的内容.语法是什么样的?

但是,如果只需要使用此功能来测试Null Guard是否起作用,则可以使用AutoFixture.Idioms.

这是一个例子.

var fixture = new Fixture();
var assertion = new GuardClauseAssertion(fixture);
var method = typeof(GuardedMethodHost).GetMethod("ConsumeStringAndInt32AndGuid");
assertion.Verify(method);

如果您看一下the source code of Ploeh.AutoFixture.IdiomsUnitTest.Scenario,还会发现其他示例,但我承认这是AutoFixture文献中记录较少的领域之一…

完全另一件事是,具有很少参数(或没有参数)的方法要比具有许多参数的方法更好,因此您是否考虑过引入参数对象?

标签:autofixture,unit-testing,mocking,c
来源: https://codeday.me/bug/20191201/2078041.html