public async Task GenerateDraw_CallsBusinessAndRepositoryLayer_ReturnsCorrectDrawNumberAsync() { // Arrange DateTime expectedSellUntilDate = new DateTime(2018, 1, 1); int expectedNumberOfBallots = 10; int expectedNumber = 222; var expectedBallots = new List <Ballot>(); int expectedMainPriceAmount = 10000; int expectedFinalNumberPriceAmount = 5; lotteryMock .Setup(mock => mock.GenerateBallotsAsync(expectedNumberOfBallots)) .ReturnsAsync(expectedBallots); Draw actualDraw = null; drawRepositoryMock.Setup(mock => mock.Insert(It.IsAny <Draw>())) .Callback((Draw draw) => { actualDraw = draw; }) .Returns(expectedNumber); var drawConfiguration = new DrawConfiguration { SellUntilDate = expectedSellUntilDate, NumberOfBallots = expectedNumberOfBallots, MainPriceAmount = expectedMainPriceAmount, FinalNumberPriceAmount = expectedFinalNumberPriceAmount }; // Act int result = await drawController.GenerateDraw(drawConfiguration); // Assert result.Should().Be(expectedNumber); actualDraw.Should().NotBeNull(); actualDraw.SellUntilDate.Should().Be(expectedSellUntilDate); actualDraw.Ballots.Should().Equal(expectedBallots); actualDraw.Prices.Should().HaveCount(2); var firstPrice = actualDraw.Prices.ElementAt(0); firstPrice.PriceType.Should().Be(PriceType.Main); firstPrice.Amount.Should().Be(expectedMainPriceAmount); var secondPrice = actualDraw.Prices.ElementAt(1); secondPrice.PriceType.Should().Be(PriceType.FinalDigit); secondPrice.Amount.Should().Be(expectedFinalNumberPriceAmount); lotteryMock.VerifyAll(); drawRepositoryMock.VerifyAll(); }