繁体   English   中英

使用委托作为“工厂方法”在C#中进行单元测试

[英]Using a delegate as “factory method” for unit testing in C#

问题

让我们“画出”情况图:

  • 我有一个SUT。 (有好处:P)
  • 我可以在我的SUT上注入一些依赖项。
  • 在一个方法中我做了一个:new OtherClass(ParametersObtainedFromDependancies)。
  • 我想在我的SUT中对该方法进行单元测试,而不需要处理创建模拟对象的复杂性,这对于使OtherClass正常工作是有意义的。 这将意味着测试OtherClass。

我的解决方案是使用委托的工厂方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM