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