什么是Humble Object模式以及何时有用?

我正在阅读Dino Esposito关于如何在ASP.NET MVC中测试AsyncConrollers的文章 ,在那里他使用了“Humble Object”模式,但没有详细说明。

谷歌周围也没有多少运气。

那么,Humble Object模式是什么? 什么时候有用?

xunitpatterns.com上有详尽的描述 。

基本上,您将所有逻辑拉入一个可以轻松测试的单独对象 – 并且您的“Humble Object”成为可测试对象的包装器; 它只是简单的对象也依赖于难以测试的东西,比如异步服务或GUI类。 这个想法是在你不需要测试它的简陋对象中留下如此少的实际逻辑,因此不需要处理测试难以测试的依赖性。

我通常将此类实现为Interface – 然后您可以使用模拟框架将其存根以进行测试,并使用IoC框架在运行时注入正确的实现。

这是我当前项目的一个例子:

 public interface IUserInterface { string AskUserWhereToSaveFile( string title, FileType defaultFileType, string defaultFileName = null, params FileType[] otherOptions ); string AskUserToSelectFileToLoad( string title, FileType defaultFileType, params FileType[] fileTypes ); void ShowError(string title, string details); bool AskUserIfTheyWantToRetryAfter(string errorMessage); } 

然后,我的控制器依赖IUserInterface而不是具体视图,这允许我用存根替换用户交互以进行测试。