MVP — Model View Presenter
The Untestable Screen
Table of Contents
The Three Roles
┌──────────────────────────────────────────────────────────┐
│ View │
│ - Renders what it is told │
│ - Calls presenter methods on user events │
│ - NO business logic, NO data fetching │
└──────────────┬───────────────────┬───────────────────────┘
│ events │ render commands
▼ ▲
┌──────────────────────────────────────────────────────────┐
│ Presenter │
│ - One plain class (no framework dependencies) │
│ - Handles events from view │
│ - Calls model / service │
│ - Calls view methods to update display │
└──────────────────────────┬───────────────────────────────┘
│ data requests
▼
┌──────────────────────────────────────────────────────────┐
│ Model │
│ - Data, domain rules, persistence │
│ - No knowledge of UI │
└──────────────────────────────────────────────────────────┘Passive View Contract
How MVP Differs from MVC
Aspect
MVC
MVP
TypeScript Example: Order Summary Screen
Testing the Presenter Without a DOM
Python Example: CLI Presenter
When to Use MVP
Lessons Learned
Last updated