![Page 1: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/1.jpg)
Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver
![Page 2: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/2.jpg)
![Page 3: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/3.jpg)
![Page 4: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/4.jpg)
An opinionated definition
![Page 5: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/5.jpg)
![Page 6: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/6.jpg)
![Page 7: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/7.jpg)
![Page 8: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/8.jpg)
![Page 9: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/9.jpg)
![Page 10: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/10.jpg)
![Page 11: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/11.jpg)
![Page 12: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/12.jpg)
(in my definition)
![Page 13: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/13.jpg)
1. Design the class responsibilities
2. Write a first unit test
3. Generate stubs using R#, Rider, etc
4. Ensure test fails for the right reason
5. Implement the real deal
6. Ensure test succeeds
7. Identify alternative scenarios
8. Repeat twice
9. Refactor.
![Page 14: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/14.jpg)
![Page 15: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/15.jpg)
![Page 16: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/16.jpg)
![Page 17: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/17.jpg)
![Page 18: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/18.jpg)
![Page 19: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/19.jpg)
![Page 20: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/20.jpg)
![Page 21: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/21.jpg)
![Page 22: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/22.jpg)
Order Processing
IStoreOrders<T>+ CreateQuery<T>();+ Add<T>();+ Delete<T>();
NHibernateRepository
Order Processing
IStoreOrders+ GetIncompletedOrders(minValue);+ StoreOrder();+ CompleteOrder();
OrderRepository
VS
![Page 23: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/23.jpg)
![Page 24: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/24.jpg)
eventMonitor.OccurredEvents.Should().BeEquivalentTo(new[]{
new{
EventName = "PropertyChanged",TimestampUtc = utcNow - 1.Hours(),Parameters = new object[] { “third”, “first”, 123 }
},new{
EventName = "NonConventionalEvent",TimestampUtc = utcNow,Parameters = new object[] { "first", 123, "third" }
}}, o => o.WithStrictOrdering());
![Page 25: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/25.jpg)
![Page 26: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/26.jpg)
Command Handlers
Commands
Domain Model
Event Store
Events
App
Query Store
RavenDB
ProjectorsEvents
API Controller
Projections
Events
![Page 27: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/27.jpg)
![Page 28: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/28.jpg)
• Define the boundary carefully• Use BDD or AAA when applicable
• Don’t repeat the context in names• Don’t use technical names• Avoid constants• Use Test Data Builders for the irrelevant
parts• Show relevant dependencies• Only assert the relevant parts• Keep refactoring• Keep out of the debugger hell.
![Page 29: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/29.jpg)
![Page 30: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for](https://reader034.vdocuments.net/reader034/viewer/2022042316/5f046f747e708231d40df422/html5/thumbnails/30.jpg)
• Example codehttps://github.com/dennisdoomen/EffectiveTddDemo
• Chillhttps://github.com/ChillBdd/Chill
• Fluent Assertionshttps://www.fluentassertions.com
• Laws of Jeremy D. Millerhttp://codebetter.com/jeremymiller/2005/10/21/haacked-on-tdd-and-jeremys-first-rule-of-tdd/
• Xunit Patternshttp://xunitpatterns.com/
• Test data buildershttp://www.natpryce.com/articles/000714.html