diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/MockingWithNSubstitute.Tests.csproj b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/MockingWithNSubstitute.Tests.csproj index cdee3342cd..b4a5dcdbb6 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/MockingWithNSubstitute.Tests.csproj +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/MockingWithNSubstitute.Tests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -10,19 +10,18 @@ - - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/NotificationServiceTests.cs b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/NotificationServiceTests.cs index d31382404b..b3884b2a14 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/NotificationServiceTests.cs +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/NotificationServiceTests.cs @@ -1,3 +1,5 @@ +using NSubstitute.ExceptionExtensions; + namespace MockingWithNSubstitute.Tests; public class NotificationServiceTests @@ -16,7 +18,7 @@ public NotificationServiceTests() [Fact] public void GivenInputIsCorrect_WhenNotifyUserIsInvoked_ThenTrueIsReturned() { - // Arrange + // Arrange const string message = "Mocking behaviors and expectations with NSubstitute"; _emailService.IsValidEmail(_user.Email) .Returns(true); @@ -27,7 +29,7 @@ public void GivenInputIsCorrect_WhenNotifyUserIsInvoked_ThenTrueIsReturned() var result = _notificationService.NotifyUser(_user, message); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -44,25 +46,35 @@ public void GivenInputIsNotCorrect_WhenNotifyUserIsInvoked_ThenFalseIsReturned() var result = _notificationService.NotifyUser(_user, message); // Assert - result.Should().BeFalse(); + Assert.False(result); _emailService.Received().IsValidEmail(Arg.Any()); _emailService.DidNotReceive().SendEmail(Arg.Any(), Arg.Is(x => x.Length > 5), message); } [Fact] - public void GivenExceptionIsThrown_WhenNotifyUserIsInvoked_ThenFalseIsReturned() + public void GivenExceptionIsThrown_WhenNotifyUserIsInvoked_ThenExceptionIsPropagated() { // Arrange const string message = "Throwing Exceptions When Mocking With NSubstitute"; _emailService.IsValidEmail(_user.Email) .Returns(true); - _emailService.When(x => x.SendEmail(_user.Email, "Notification from CodeMaze", message)) - .Do(x => { throw new InvalidEmailException(); }); + _emailService.SendEmail(_user.Email, "Notification from CodeMaze", message) + .Throws(); - // Act - var act = () => _notificationService.NotifyUser(_user, message); + // Act & Assert + Assert.Throws(() => _notificationService.NotifyUser(_user, message)); + } - // Assert - act.Should().ThrowExactly(); + [Fact] + public async Task GivenExceptionIsThrown_WhenSendEmailAsyncIsAwaited_ThenExceptionIsPropagated() + { + // Arrange + const string message = "Throwing exceptions from asynchronous members"; + _emailService.SendEmailAsync(_user.Email, "Notification from CodeMaze", message) + .ThrowsAsync(); + + // Act & Assert + await Assert.ThrowsAsync(() => + _emailService.SendEmailAsync(_user.Email, "Notification from CodeMaze", message)); } } diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/Usings.cs b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/Usings.cs index 82e9ad1ea9..559b01df64 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/Usings.cs +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute.Tests/Usings.cs @@ -1,3 +1,2 @@ -global using FluentAssertions; global using NSubstitute; global using Xunit; diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/IEmailService.cs b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/IEmailService.cs index 7f4f609a48..0e622dfae9 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/IEmailService.cs +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/IEmailService.cs @@ -4,4 +4,5 @@ public interface IEmailService { bool IsValidEmail(string email); bool SendEmail(string recipient, string subject, string message); + Task SendEmailAsync(string recipient, string subject, string message); } diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/MockingWithNSubstitute.csproj b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/MockingWithNSubstitute.csproj index cfadb03dd5..9ed914b5ba 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/MockingWithNSubstitute.csproj +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/MockingWithNSubstitute.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable diff --git a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/NotificationService.cs b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/NotificationService.cs index 40485a6347..d4ad99952d 100644 --- a/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/NotificationService.cs +++ b/dotnet-testing/MockingWithNSubstitute/MockingWithNSubstitute/NotificationService.cs @@ -17,16 +17,7 @@ public bool NotifyUser(User user, string message) return false; } - try - { - var sentSuccessfully = _emailService + return _emailService .SendEmail(user.Email, "Notification from CodeMaze", message); - - return sentSuccessfully; - } - catch - { - throw; - } } }