Unit Testing ASP.Net MVC Craig Berntson Mojo Software Worx
Ego stuff Chief Software Gardener Mojo Software Worx Salt Lake City Author, “Continuous Integration in.Net” Columnist, “.Net Curry” eMagazine Conference & event speaker INETA Community Speaker ComponentOne Community Influencer Chief Software Gardener Mojo Software Worx Salt Lake City Author, “Continuous Integration in.Net” Columnist, “.Net Curry” eMagazine Conference & event speaker INETA Community Speaker ComponentOne Community Influencer
3
Problem with… if switch for foreach while do…while
Worse than you think In 1976, G.J. Meyers described a 100-line program that had unique paths. In 1979 he described a much simpler program. It was just a loop and a few IF statements. In most languages, you could write it in 20 lines of code. This program has 100 trillion paths Testing Computer Software, Cem Kaner In 1976, G.J. Meyers described a 100-line program that had unique paths. In 1979 he described a much simpler program. It was just a loop and a few IF statements. In most languages, you could write it in 20 lines of code. This program has 100 trillion paths Testing Computer Software, Cem Kaner
How do you test this? 6
Agenda What we won’t talk about TDD Javascript testing Production ready code What we won’t talk about TDD Javascript testing Production ready code What we’ll talk about Setup tests Remove database Keep it simple
Demo: Sample Application 8
Unit test framework MSTest NUnit xUnit Others MSTest NUnit xUnit Others
Unit test runner MSTest NUnit Resharper NCrunch Others MSTest NUnit Resharper NCrunch Others
Demo: Our first test 11
Default Data access Difficult to test There is no IDbContext DbContext tightly bound to EF (EntityFramework.dll) Difficult to test There is no IDbContext DbContext tightly bound to EF (EntityFramework.dll) ControllerContext Entity Framework
Removing database access 1.Repositories 2.Mocks 3.Dependency Injection 1.Repositories 2.Mocks 3.Dependency Injection
Repositories Easy to test IRepository Extrapolate away from Context Easy to test IRepository Extrapolate away from Context ControllerRepositoryContext Entity Framework
Mocks Allows us to fake the database ControllerRepositoryMock
Testing vs. runtime ControllerRepositoryMock Context Entity Framework
Class2 How we normally instantiate Class1 new Class2()
ClassA Dependency injection Class1 IClass2() ClassA : IClass2
Dependency injection Allows for loose coupling Inversion of control (IOC) IOC Container Allows for loose coupling Inversion of control (IOC) IOC Container
Ajax & json AJAX calls into the controller JSON returns result AJAX calls into the controller JSON returns result
Demo: ajax & json 21
Next steps? My blog Art of Unit Testing Udemy.com Katas TDD My blog Art of Unit Testing Udemy.com Katas TDD
Review Arrange – Act – Assert In memory Repositories Mocks Dependency Injection Arrange – Act – Assert In memory Repositories Mocks Dependency Injection
Questions? 24