diff --git a/samples/Dressca/dressca-backend/tests/Dressca.UnitTests.ApplicationCore/ApplicationService/ShoppingApplicationServiceTest.cs b/samples/Dressca/dressca-backend/tests/Dressca.UnitTests.ApplicationCore/ApplicationService/ShoppingApplicationServiceTest.cs index b10d0b830..397bc319c 100644 --- a/samples/Dressca/dressca-backend/tests/Dressca.UnitTests.ApplicationCore/ApplicationService/ShoppingApplicationServiceTest.cs +++ b/samples/Dressca/dressca-backend/tests/Dressca.UnitTests.ApplicationCore/ApplicationService/ShoppingApplicationServiceTest.cs @@ -441,9 +441,17 @@ public async Task AddItemToBasketAsync_カタログリポジトリに存在す It.Is(b => b.Items.Count == 1), AnyToken), Times.Once); basketRepo.Verify( - r => r.UpdateAsync( - It.Is(b => b.Items.ToList().Exists(item => (item.CatalogItemId == catalogItem.Id) && (item.Quantity == 5) && (item.UnitPrice == catalogItem.Price))), AnyToken), - Times.Once); + r => r.UpdateAsync( + It.Is(b => b.Items.First().CatalogItemId == catalogItem.Id), AnyToken), + Times.Once); + basketRepo.Verify( + r => r.UpdateAsync( + It.Is(b => b.Items.First().Quantity == 5), AnyToken), + Times.Once); + basketRepo.Verify( + r => r.UpdateAsync( + It.Is(b => b.Items.First().UnitPrice == catalogItem.Price), AnyToken), + Times.Once); } [Theory] @@ -660,6 +668,67 @@ public async Task CheckoutAsync_買い物かごにアイテムが存在する_ Times.Once); } + [Fact] + public async Task CheckoutAsync_買い物かごにアイテムが存在する_注文リポジトリのAddAsyncの引数に注文アイテムが正しく設定されている() + { + // Arrange + var dummyBuyerId = "dummyId"; + var dummyBasket = new Basket { BuyerId = dummyBuyerId }; + dummyBasket.AddItem(10L, 1000); + var shipTo = CreateDefaultShipTo(); + var catalogItems = new List + { + new() { CatalogCategoryId = 100L, CatalogBrandId = 110L, Description = "説明1", Name = "ダミー商品1", Price = 1000m, ProductCode = "C000000001", Id = 10L }, + }; + var order = new Order(CreateDefaultOrderItems()) { BuyerId = dummyBuyerId, ShipToAddress = shipTo }; + + var basketRepo = new Mock(); + basketRepo + .Setup(r => r.GetWithBasketItemsAsync(dummyBuyerId, AnyToken)) + .ReturnsAsync(dummyBasket); + basketRepo + .Setup(r => r.RemoveAsync(dummyBasket, AnyToken)) + .Returns(Task.CompletedTask); + var orderRepo = new Mock(); + orderRepo + .Setup(r => r.AddAsync(order, AnyToken)) + .ReturnsAsync(order); + var orderFactory = new Mock(); + orderFactory + .Setup(f => f.CreateOrder(dummyBasket, catalogItems, shipTo)) + .Returns(order); + var catalogRepo = new Mock(); + catalogRepo + .Setup(r => r.FindAsync(It.IsAny>>(), AnyToken)) + .ReturnsAsync(catalogItems.AsReadOnly()); + var catalogDomainService = Mock.Of(); + var logger = this.CreateTestLogger(); + var service = new ShoppingApplicationService(basketRepo.Object, orderRepo.Object, orderFactory.Object, catalogRepo.Object, catalogDomainService, logger); + + // Act + await service.CheckoutAsync(dummyBuyerId, shipTo); + + // Assert + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.Count == 1), AnyToken), + Times.Once); + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.First().Quantity == 1), AnyToken), + Times.Once); + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.First().UnitPrice == 1000m), AnyToken), + Times.Once); + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.First().ItemOrdered.ProductName == "ダミー商品1"), AnyToken), + Times.Once); + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.First().ItemOrdered.ProductCode == "C000000001"), AnyToken), + Times.Once); + orderRepo.Verify( + r => r.AddAsync(It.Is(o => o.OrderItems.First().ItemOrdered.CatalogItemId == 1), AnyToken), + Times.Once); + } + [Fact] public async Task CheckoutAsync_買い物かごにアイテムが存在する_買い物かごリポジトリのRemoveAsyncを1度だけ呼び出す() {