public async Task Retrieving_A_Basket_Should_Apply_Special_Offers() { var mockProductManager = new Mock <IProductManager>(); var basketRepository = new Mock <IBasketRepository>(); var specialOfferRepository = new Mock <ISpecialOfferRepository>(); mockProductManager.Setup(x => x.GetAllProducts()).ReturnsAsync(() => productList); basketRepository.Setup(x => x.GetBasket()).ReturnsAsync(() => basketItems); specialOfferRepository.Setup(x => x.GetSpecialOffersForProduct("B15")).ReturnsAsync(() => new List <SpecialOffer> { new SpecialOffer { Price = 0.45m, Quantity = 2, SKU = "B15" } }); specialOfferRepository.Setup(x => x.GetSpecialOffersForProduct("A99")).ReturnsAsync(() => new List <SpecialOffer>()); var basketManager = new BasketManager(mockProductManager.Object, basketRepository.Object, specialOfferRepository.Object); var result = await basketManager.GetCurrentBasket(); //Two different distinct item types. (2 A99's, 3 B15's) result.Items.Count.Should().Be(2); result.Total.Should().Be(1.75m); //0.50 + 0.50 + 0.45 (2 products discounted) + 0.30 }