[Fact] // behavioural or communication (white box) public void Successful_booking_should_capture_payment() { // arrange var id = Guid.NewGuid().ToString(); // managed dependency - concrete instance var bookingRepository = new BookingRepositoryMongoDB(this.mongoClient); // unmanaged dependency - interface var priceCalculator = A.Fake <IPriceCalculator>(); var paymentGateway = A.Fake <IPaymentGateway>(); var sut = new BookingService(bookingRepository, paymentGateway, priceCalculator); // act sut.CreateBooking(new BookingService.CreateBookingRequest(id, "jason")); // assert A.CallTo(() => paymentGateway.CapturePayment(A <decimal> .Ignored)).MustHaveHappened(); }
[Fact] // state based (black box) public void Successful_booking_should_be_persisted() { // arrange var id = Guid.NewGuid().ToString(); var bookingRepository = new BookingRepositoryMongoDB(this.mongoClient); // unmanaged dependency - interface var paymentGateway = A.Fake <IPaymentGateway>(); var priceCalculator = A.Fake <IPriceCalculator>(); var sut = new BookingService(bookingRepository, paymentGateway, priceCalculator); // simulate that the payment fails A.CallTo(() => paymentGateway.CapturePayment(A <decimal> .Ignored)).Returns(true); // act sut.CreateBooking(new BookingService.CreateBookingRequest(id, "jason")); var booking = bookingRepository.GetById(id); // assert booking.Id.Should().Be(id); }
[Fact] // behavioural or communication (white box) public void Should_use_total_price_from_price_service() { // arrange var id = Guid.NewGuid().ToString(); // managed dependency - concrete instance var bookingRepository = new BookingRepositoryMongoDB(this.mongoClient); // unmanaged dependency - interface var priceCalculator = A.Fake <IPriceCalculator>(); var paymentGateway = A.Fake <IPaymentGateway>(); var sut = new BookingService(bookingRepository, paymentGateway, priceCalculator); // use price calculator as stub A.CallTo(() => priceCalculator .GetPriceForBookingWith(A <int> .Ignored, A <int> .Ignored)) .Returns(100); // act sut.CreateBooking(new BookingService.CreateBookingRequest(id, "jason")); // assert A.CallTo(() => paymentGateway.CapturePayment(100)).MustHaveHappened(); }