Ser*_*eit 17 .net c# design-patterns
我正在阅读Dino Esposito关于如何在ASP.NET MVC中测试AsyncConrollers的文章,在那里他使用了"Humble Object"模式,而没有详细介绍.
谷歌周围也没有运气.
那么,Humble Object模式是什么?什么时候有用?
Mas*_*sif 34
基本上,您将所有逻辑拉入一个可以轻松测试的单独对象 - 并且您的"Humble Object"成为可测试对象的包装器; 它只是简单的对象也依赖于难以测试的东西,比如异步服务或GUI类.这个想法是在你不需要测试它的简陋对象中留下如此少的实际逻辑,因此不需要处理测试难以测试的依赖性.
Mat*_*hen 13
简陋对象模式在书中提到 - Clean Architecture: A Craftsman's Guide to Software Structure and Design by Uncle Bob,第 23 章 - PRESENTERS AND HUMBLE OBJECTS ( https://learning.oreilly.com/library/view/clean-architecture- a/9780134494272/ch23.xhtml)。
这种模式应用于系统的边界,在这些边界上,事情通常很难测试,以便使它们更易于测试。我们通过减少靠近边界的逻辑来实现该模式,使靠近边界的代码变得非常简单,以至于不需要进行测试。提取的逻辑被移至另一个类中,与边界解耦,使其可测试。
当使用 UI 相关代码或数据库代码时,此模式非常有用。主要思想是使UI代码或数据库代码等经常变化的层尽可能薄。您不会对该层进行任何单元测试。
将所有业务逻辑移至不同的层并为此进行详细的单元测试。
整个想法是使复杂或频繁变化的层尽可能简单或薄,并排除为此编写单元测试(因为它不值得您投入精力)。通过对其进行详细测试来专注于业务逻辑层。
我通常会将此类实现为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);
}
Run Code Online (Sandbox Code Playgroud)
然后,我的控制器依赖IUserInterface而不是具体视图,这允许我用存根替换用户交互以进行测试.
| 归档时间: |
|
| 查看次数: |
9985 次 |
| 最近记录: |