![Page 1: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/1.jpg)
Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver
![Page 2: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/2.jpg)
![Page 3: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/3.jpg)
![Page 4: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/4.jpg)
An opinionated definition
![Page 5: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/5.jpg)
![Page 6: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/6.jpg)
![Page 7: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/7.jpg)
![Page 8: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/8.jpg)
![Page 9: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/9.jpg)
![Page 10: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/10.jpg)
![Page 11: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/11.jpg)
![Page 12: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/12.jpg)
(in my definition)
![Page 13: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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 Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/14.jpg)
![Page 15: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/15.jpg)
![Page 16: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/16.jpg)
![Page 17: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/17.jpg)
![Page 18: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/18.jpg)
![Page 19: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/19.jpg)
![Page 20: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/20.jpg)
![Page 21: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/21.jpg)
![Page 22: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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 Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/23.jpg)
![Page 24: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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 Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/25.jpg)
![Page 26: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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 Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/27.jpg)
![Page 28: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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 Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/html5/thumbnails/29.jpg)
![Page 30: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,](https://reader033.vdocuments.net/reader033/viewer/2022042316/5f046f747e708231d40df41f/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