ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-01 03:05:59  阅读:214  来源: 互联网

标签:autofixture unit-testing mocking c


在基于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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有