[英]Using a delegate as “factory method” for unit testing in C#
让我们“画出”情况图:
我的解决方案是使用委托的工厂方法:
public Func<OtherClass,Param1Type> GetOtherClass =
(param1) => new OtherClass(param1);
坏事:它是公开的。 您可以将其视为可选依赖项,您可以根据需要覆盖它。 但无论如何,公众气味。
好处:我不需要创建一个会覆盖此方法的MyTestSUT,甚至不需要在SUT上使用模拟来覆盖该方法。
有没有更好的解决方案? 这个对吗?
你为什么把它变成公共领域? 听起来它基本上就像任何其他依赖项一样:当你给它一些其他的值时,你想要的东西会为你提供一个OtherClass
。 为什么不像其他依赖项那样使它成为构造函数参数(或者你正在进行其余的依赖注入)?
如果需要,您始终可以提供没有此参数的构造函数重载,该参数将委托给较长的参数。 这就是我通常提供“默认”依赖项实现的方式。
换句话说:这与IAuthenticator
接口在逻辑上有何不同,当提供用户名和密码时,它将返回UserProfile
? 您碰巧使用委托作为快捷方式来避免声明界面,但这只是一个细节IMO。 您可能会发现,随着时间的推移,您实际上希望在“提供”部分中添加更多智能 - 例如缓存。
听起来你想要使用类似于AutoFixture的东西,并启用AutoMoq自定义。 如果您愿意,这将使您可以模拟SUT中的所有或部分公共字段以及其他构造函数参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.