Chapter 14 Slides
Chapter 14 Slides
How to use
dependency injection
and unit testing
Knowledge
3. Describe how to configure a web app for dependency injection.
4. List and describe the three dependency life cycles.
5. Distinguish between controllers that are tightly coupled with EF
Core and controllers that are loosely coupled with EF Core.
6. Explain how dependency chaining works with repository objects
and unit of work objects.
7. Describe the use of DI with an HttpContextAccessor object.
Assert.IsType<string>(result); // assert
}
// act
var result = controller.Index();
// assert
Assert.IsType<ViewResult>(result);
}
// act
var result = controller.Edit(new Author());
// assert
Assert.IsType<RedirectToActionResult>(result);
}
// act
var result = controller.Index();
// assert
Assert.IsType<ViewResult>(result);
}
// act
var result = controller.Edit(new Author());
// assert
Assert.IsType<RedirectToActionResult>(result);
}
// act
var result = cart.Subtotal;
// assert
Assert.IsType<double>(result);
}
namespace Bookstore.Tests
{
public class BookControllerTests
{
[Fact]
public void Index_ReturnsARedirectToActionResult() {
// arrange
var unit = new Mock<IBookstoreUnitOfWork>();
var controller = new BookController(unit.Object);
// act
var result = controller.Index();
// assert
Assert.IsType<RedirectToActionResult>(result);
}
// act
var result = controller.Index();
// assert
Assert.Equal("List", result.ActionName);
}
// act
var model =
controller.Details(1).ViewData.Model as Book;
// assert
Assert.IsType<Book>(model);
}
}
}
namespace Bookstore.Tests
{
public class AdminBookControllerTests
{
public IBookstoreUnitOfWork GetUnitOfWork()
{
// set up Book repository
var bookRep = new Mock<IRepository<Book>>();
bookRep.Setup(m => m.Get(It.IsAny<QueryOptions<Book>>()))
.Returns(new Book { BookAuthors = new List<BookAuthor>() });
bookRep.Setup(m => m.List(It.IsAny<QueryOptions<Book>>()))
.Returns(new List<Book>());
bookRep.Setup(m => m.Count).Returns(0);
return unit.Object;
}
[Fact]
public void Edit_GET_ModelIsBookObject()
{
// arrange
var unit = GetUnitOfWork();
var controller = new BookController(unit);
// act
var model = controller.Edit(1).ViewData.Model as BookViewModel;
// assert
Assert.IsType<BookViewModel>(model);
}
// act
var result = controller.Edit(vm);
// assert
Assert.IsType<ViewResult>(result);
}
// act
var result = controller.Edit(vm);
// assert
Assert.IsType<RedirectToActionResult>(result);
}
}
}
namespace Bookstore.Tests
{
public class CartTests
{
private Cart GetCart()
{
// create HTTP context accessor
var accessor = new Mock<IHttpContextAccessor>();
// setup session
var session = new Mock<ISession>();
accessor.Setup(m => m.HttpContext.Session)
.Returns(session.Object);
[Fact]
public void Subtotal_ReturnsADouble()
{
// arrange
Cart cart = GetCart();
cart.Add(new CartItem { Book = new BookDTO() });
// act
var result = cart.Subtotal;
// assert
Assert.IsType<double>(result);
}
// act
var result = cart.Subtotal;
// assert
Assert.Equal(Math.Round(expected, 2), Math.Round(result, 2));
}
}
}