diff --git a/Directory.Packages.props b/Directory.Packages.props
index 3056a45bf..eee2f424b 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -36,7 +36,6 @@
-
@@ -61,7 +60,6 @@
-
diff --git a/src/DevBetterWeb.Core/Services/MemberAddBillingActivityService.cs b/src/DevBetterWeb.Core/Services/MemberAddBillingActivityService.cs
index 91a2598f1..5e2553f3d 100644
--- a/src/DevBetterWeb.Core/Services/MemberAddBillingActivityService.cs
+++ b/src/DevBetterWeb.Core/Services/MemberAddBillingActivityService.cs
@@ -10,7 +10,7 @@ public class MemberAddBillingActivityService : IMemberAddBillingActivityService
{
private readonly IRepository _memberRepository;
private readonly IMemberLookupService _memberLookupService;
-
+
public MemberAddBillingActivityService(IRepository memberRepository,
IMemberLookupService memberLookup)
{
@@ -18,6 +18,13 @@ public MemberAddBillingActivityService(IRepository memberRepository,
_memberLookupService = memberLookup;
}
+#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
+ public MemberAddBillingActivityService()
+#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
+ {
+
+ }
+
///
/// This should only be called after a member has registered and been created.
///
diff --git a/src/DevBetterWeb.Web/Views/Home/Index.cshtml b/src/DevBetterWeb.Web/Views/Home/Index.cshtml
index 88c6431e9..ef3aad6c8 100644
--- a/src/DevBetterWeb.Web/Views/Home/Index.cshtml
+++ b/src/DevBetterWeb.Web/Views/Home/Index.cshtml
@@ -369,7 +369,6 @@
Join the devBetter group coaching program today and get immediate access to all recorded sessions, the
Discord channel,
the web site resources, the private GitHub, the private Stack Overflow team, and more!
-
diff --git a/tests/DevBetterWeb.Tests/DevBetterWeb.Tests.csproj b/tests/DevBetterWeb.Tests/DevBetterWeb.Tests.csproj
index b0a4a389f..d585a35ff 100644
--- a/tests/DevBetterWeb.Tests/DevBetterWeb.Tests.csproj
+++ b/tests/DevBetterWeb.Tests/DevBetterWeb.Tests.csproj
@@ -49,7 +49,6 @@
-
diff --git a/tests/DevBetterWeb.Tests/Services/AlumniGraduationServiceTests/CheckIfAnyMemberGraduating.cs b/tests/DevBetterWeb.Tests/Services/AlumniGraduationServiceTests/CheckIfAnyMemberGraduating.cs
index 2f91ae17b..009556ab5 100644
--- a/tests/DevBetterWeb.Tests/Services/AlumniGraduationServiceTests/CheckIfAnyMemberGraduating.cs
+++ b/tests/DevBetterWeb.Tests/Services/AlumniGraduationServiceTests/CheckIfAnyMemberGraduating.cs
@@ -5,17 +5,17 @@
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.ValueObjects;
using DevBetterWeb.Infrastructure.Services;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.AlumniGraduationServiceTests;
public class CheckIfAnyMemberGraduating
{
- private readonly Mock userLookupService;
- private readonly Mock> repository;
- private readonly Mock graduationCommunications;
- private readonly Mock userManager;
+ private readonly IUserLookupService userLookupService;
+ private readonly IRepository repository;
+ private readonly IGraduationCommunicationsService graduationCommunications;
+ private readonly IUserRoleManager userManager;
private const int DAYS_IN_TWO_YEARS = 365 * 2;
@@ -23,11 +23,11 @@ public class CheckIfAnyMemberGraduating
public CheckIfAnyMemberGraduating()
{
- userLookupService = new Mock();
- repository = new Mock>();
- graduationCommunications = new Mock();
- userManager = new Mock();
- service = new AlumniGraduationService(userLookupService.Object, repository.Object, graduationCommunications.Object, userManager.Object);
+ userLookupService = Substitute.For();
+ repository = Substitute.For>();
+ graduationCommunications = Substitute.For();
+ userManager = Substitute.For();
+ service = new AlumniGraduationService(userLookupService, repository, graduationCommunications, userManager);
}
[Fact]
@@ -47,7 +47,7 @@ public async Task ReturnsSameListGivenListWithAllMembersGraduating()
var graduatingMember = GetGraduatingMember();
testlist.Add(graduatingMember);
- userLookupService.Setup(u => u.FindUserIsAlumniByUserIdAsync(graduatingMember.UserId)).ReturnsAsync(false);
+ userLookupService.FindUserIsAlumniByUserIdAsync(graduatingMember.UserId).Returns(Task.FromResult(false));
var list = await service.CheckIfAnyMemberGraduating(testlist);
@@ -65,8 +65,8 @@ public async Task ReturnsOnlyGraduatingMembersGivenListWithSomeMembersGraduating
var nonGraduatingMember = GetNonGraduatingMember();
testlist.Add(nonGraduatingMember);
- userLookupService.Setup(u => u.FindUserIsAlumniByUserIdAsync(graduatingMember.UserId)).ReturnsAsync(false);
-
+ userLookupService.FindUserIsAlumniByUserIdAsync(graduatingMember.UserId).Returns(Task.FromResult(false));
+
var list = await service.CheckIfAnyMemberGraduating(testlist);
Assert.Contains(graduatingMember, list);
@@ -91,8 +91,8 @@ public async Task ReturnsEmptyListGivenListOfAlumni()
var testlist = new List();
var alum = GetGraduatingMember();
testlist.Add(alum);
-
- userLookupService.Setup(u => u.FindUserIsAlumniByUserIdAsync(alum.UserId)).ReturnsAsync(true);
+
+ userLookupService.FindUserIsAlumniByUserIdAsync(alum.UserId).Returns(Task.FromResult(true));
var list = await service.CheckIfAnyMemberGraduating(testlist);
@@ -109,7 +109,7 @@ public async Task ReturnsEmptyListGivenListWithMemberOneDayFromGraduation()
member.MemberSubscriptions.Add(nearGraduationSubscription);
testlist.Add(member);
- userLookupService.Setup(u => u.FindUserIsAlumniByUserIdAsync(member.UserId)).ReturnsAsync(false);
+ userLookupService.FindUserIsAlumniByUserIdAsync(member.UserId).Returns(Task.FromResult(false));
var list = await service.CheckIfAnyMemberGraduating(testlist);
diff --git a/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireAdminPing.cs b/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireAdminPing.cs
index 8a4870e18..55e9ceeea 100644
--- a/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireAdminPing.cs
+++ b/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireAdminPing.cs
@@ -4,17 +4,17 @@
using DevBetterWeb.Infrastructure.Identity.Data;
using DevBetterWeb.Infrastructure.Services;
using Microsoft.AspNetCore.Identity;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.DailyCheckPingServiceTests;
public class CheckIfAnyActiveInvitationsRequireAdminPing
{
- private readonly Mock> _repository = new();
- private readonly Mock> _memberRepository = new();
- private readonly Mock _emailService = new();
- private readonly Mock> _userManager;
+ private readonly IRepository _repository;
+ private readonly IRepository _memberRepository;
+ private readonly IEmailService _emailService;
+ private readonly UserManager _userManager;
private DailyCheckPingService _service;
@@ -23,9 +23,12 @@ public class CheckIfAnyActiveInvitationsRequireAdminPing
public CheckIfAnyActiveInvitationsRequireAdminPing()
{
- var store = new Mock>();
- _userManager = new Mock>(store.Object, null, null, null, null, null, null, null, null);
- _service = new DailyCheckPingService(_repository.Object, _memberRepository.Object, _emailService.Object, _userManager.Object);
+ var store = Substitute.For>();
+ _userManager = Substitute.For>(store, null, null, null, null, null, null, null, null);
+ _repository = Substitute.For>();
+ _memberRepository = Substitute.For>();
+ _emailService = Substitute.For();
+ _service = new DailyCheckPingService(_repository, _memberRepository, _emailService, _userManager);
}
[Fact]
diff --git a/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireUserPing.cs b/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireUserPing.cs
index 6cebbbfa5..38568c6f3 100644
--- a/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireUserPing.cs
+++ b/tests/DevBetterWeb.Tests/Services/DailyCheckPingServiceTests/CheckIfAnyActiveInvitationsRequireUserPing.cs
@@ -4,17 +4,17 @@
using DevBetterWeb.Infrastructure.Identity.Data;
using DevBetterWeb.Infrastructure.Services;
using Microsoft.AspNetCore.Identity;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.DailyCheckPingServiceTests;
public class CheckIfAnyActiveInvitationsRequireUserPing
{
- private readonly Mock> _repository = new();
- private readonly Mock> _membrRepository = new();
- private readonly Mock _emailService = new();
- private readonly Mock> _userManager;
+ private readonly IRepository _repository;
+ private readonly IRepository _memberRepository;
+ private readonly IEmailService _emailService;
+ private readonly UserManager _userManager;
private DailyCheckPingService _service;
@@ -23,10 +23,12 @@ public class CheckIfAnyActiveInvitationsRequireUserPing
public CheckIfAnyActiveInvitationsRequireUserPing()
{
- var store = new Mock>();
- _userManager = new Mock>(store.Object, null, null, null, null, null, null, null, null);
-
- _service = new DailyCheckPingService(_repository.Object, _membrRepository.Object, _emailService.Object, _userManager.Object);
+ var store = Substitute.For>();
+ _userManager = Substitute.For>(store, null, null, null, null, null, null, null, null);
+ _repository = Substitute.For>();
+ _memberRepository = Substitute.For>();
+ _emailService = Substitute.For();
+ _service = new DailyCheckPingService(_repository, _memberRepository, _emailService, _userManager);
}
[Fact]
diff --git a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/MemberSubscriptionCancellationServiceTest.cs b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/MemberSubscriptionCancellationServiceTest.cs
index 6d98a92ab..bcc993c8c 100644
--- a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/MemberSubscriptionCancellationServiceTest.cs
+++ b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/MemberSubscriptionCancellationServiceTest.cs
@@ -1,30 +1,30 @@
using DevBetterWeb.Core.Entities;
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Services;
-using Moq;
+using NSubstitute;
namespace DevBetterWeb.Tests.Services.MemberSubscriptionCancellationServiceTests;
public class MemberSubscriptionCancellationServiceTest
{
- internal readonly Mock _userRoleMembershipService;
- internal readonly Mock _emailService;
- internal readonly Mock _userLookup;
- internal readonly Mock _memberLookup;
- internal readonly Mock> _memberRepository;
- internal readonly Mock _subscriptionPeriodCalculationsService;
+ internal readonly IUserRoleMembershipService _userRoleMembershipService;
+ internal readonly IEmailService _emailService;
+ internal readonly IUserLookupService _userLookup;
+ internal readonly IMemberLookupService _memberLookup;
+ internal readonly IRepository _memberRepository;
+ internal readonly IMemberSubscriptionPeriodCalculationsService _subscriptionPeriodCalculationsService;
internal readonly IMemberCancellationService _memberCancellationService;
public MemberSubscriptionCancellationServiceTest()
{
- _userRoleMembershipService = new Mock();
- _emailService = new Mock();
- _userLookup = new Mock();
- _memberLookup = new Mock();
- _memberRepository = new Mock>();
- _subscriptionPeriodCalculationsService = new Mock();
- _memberCancellationService = new MemberSubscriptionCancellationService(_userRoleMembershipService.Object,
- _emailService.Object, _userLookup.Object, _memberLookup.Object, _memberRepository.Object, _subscriptionPeriodCalculationsService.Object);
+ _userRoleMembershipService = Substitute.For();
+ _emailService = Substitute.For();
+ _userLookup = Substitute.For();
+ _memberLookup = Substitute.For();
+ _memberRepository = Substitute.For>();
+ _subscriptionPeriodCalculationsService = Substitute.For();
+ _memberCancellationService = new MemberSubscriptionCancellationService(_userRoleMembershipService,
+ _emailService, _userLookup, _memberLookup, _memberRepository, _subscriptionPeriodCalculationsService);
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/RemoveUserFromMemberRoleAsync.cs b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/RemoveUserFromMemberRoleAsync.cs
index dc50d7b18..907c165c7 100644
--- a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/RemoveUserFromMemberRoleAsync.cs
+++ b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/RemoveUserFromMemberRoleAsync.cs
@@ -1,6 +1,6 @@
using System.Threading.Tasks;
using DevBetterWeb.Core;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.MemberSubscriptionCancellationServiceTests;
@@ -13,11 +13,11 @@ public class RemoveUserFromMemberRoleAsync : MemberSubscriptionCancellationServi
[Fact]
public async Task RemovesUserFromMemberRole()
{
- _userLookup.Setup(u => u.FindUserIdByEmailAsync(_email)).ReturnsAsync(_userId);
+ _userLookup.FindUserIdByEmailAsync(_email).Returns(Task.FromResult(_userId));
await _memberCancellationService.RemoveUserFromMemberRoleAsync(_email);
- _userRoleMembershipService.Verify(u => u.RemoveUserFromRoleByRoleNameAsync(_userId, Constants.MEMBER_ROLE_NAME), Times.Once);
+ await _userRoleMembershipService.Received(1).RemoveUserFromRoleByRoleNameAsync(_userId, Constants.MEMBER_ROLE_NAME);
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendCancellationEmailAsync.cs b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendCancellationEmailAsync.cs
index 3ce84ba66..6810f5ab9 100644
--- a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendCancellationEmailAsync.cs
+++ b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendCancellationEmailAsync.cs
@@ -1,5 +1,5 @@
using System.Threading.Tasks;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.MemberSubscriptionCancellationServiceTests;
@@ -13,7 +13,7 @@ public async Task SendsEmail()
{
await _memberCancellationService.SendCancellationEmailAsync(_email);
- _emailService.Verify(e => e.SendEmailAsync(_email, It.IsAny(), It.IsAny()));
+ await _emailService.Received().SendEmailAsync(_email, Arg.Any(), Arg.Any());
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendFutureCancellationEmailAsync.cs b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendFutureCancellationEmailAsync.cs
index fd1da50b6..8e567644f 100644
--- a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendFutureCancellationEmailAsync.cs
+++ b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionCancellationServiceTests/SendFutureCancellationEmailAsync.cs
@@ -3,24 +3,31 @@
using System.Threading.Tasks;
using DevBetterWeb.Core.Entities;
using DevBetterWeb.Core.Specs;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.MemberSubscriptionCancellationServiceTests;
public class SendFutureCancellationEmailAsync : MemberSubscriptionCancellationServiceTest
{
- private readonly string _email = "TestEmail";
- private readonly DateTime _date = new DateTime(1, 1, 1);
+ private readonly string _email = "TestEmail";
+ private readonly DateTime _date = new DateTime(1, 1, 1);
- [Fact]
- public async Task SendsEmail()
- {
- _memberRepository.Setup(s => s.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(new Member());
- _subscriptionPeriodCalculationsService.Setup(s => s.GetCurrentSubscriptionEndDate(It.IsAny())).Returns(_date);
+ [Fact]
+ public async Task SendsEmail()
+ {
+ _memberRepository.FirstOrDefaultAsync(
+ Arg.Any(),
+ CancellationToken.None)!
+ .Returns(Task.FromResult(new Member()));
- await _memberCancellationService.SendFutureCancellationEmailAsync(_email);
+ _subscriptionPeriodCalculationsService.GetCurrentSubscriptionEndDate(
+ Arg.Any())
+ .Returns(_date);
- _emailService.Verify(e => e.SendEmailAsync(_email, It.IsAny(), It.IsAny()));
- }
+ await _memberCancellationService.SendFutureCancellationEmailAsync(_email);
+
+ await _emailService.Received()
+ .SendEmailAsync(_email, Arg.Any(), Arg.Any());
+ }
}
diff --git a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionEndedAdminEmailServiceTests/SendMemberSubscriptionEndedEmailAsync.cs b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionEndedAdminEmailServiceTests/SendMemberSubscriptionEndedEmailAsync.cs
index ef23fa163..2969b7744 100644
--- a/tests/DevBetterWeb.Tests/Services/MemberSubscriptionEndedAdminEmailServiceTests/SendMemberSubscriptionEndedEmailAsync.cs
+++ b/tests/DevBetterWeb.Tests/Services/MemberSubscriptionEndedAdminEmailServiceTests/SendMemberSubscriptionEndedEmailAsync.cs
@@ -6,39 +6,41 @@
using DevBetterWeb.Infrastructure.Identity.Data;
using DevBetterWeb.Infrastructure.Services;
using Microsoft.AspNetCore.Identity;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.MemberSubscriptionEndedAdminEmailServiceTests;
public class SendMemberSubscriptionEndedEmailAsync
{
- private readonly MemberSubscriptionEndedAdminEmailService _memberSubscriptionEndedAdminEmailService;
+ private readonly MemberSubscriptionEndedAdminEmailService _memberSubscriptionEndedAdminEmailService;
- private readonly Mock> _userManager;
- private readonly Mock _emailService;
- private readonly Mock _memberLookup;
+ private readonly UserManager _userManager;
+ private readonly IEmailService _emailService;
+ private readonly IMemberLookupService _memberLookup;
- public SendMemberSubscriptionEndedEmailAsync()
- {
- var store = new Mock>();
- _userManager = new Mock>(store.Object, null, null, null, null, null, null, null, null);
- _emailService = new Mock();
- _memberLookup = new Mock();
- _memberSubscriptionEndedAdminEmailService = new MemberSubscriptionEndedAdminEmailService(
- _userManager.Object, _emailService.Object, _memberLookup.Object);
- }
+ public SendMemberSubscriptionEndedEmailAsync()
+ {
+ var store = Substitute.For>();
+ _userManager = Substitute.For>(store, null, null, null, null, null, null, null, null);
+ _emailService = Substitute.For();
+ _memberLookup = Substitute.For();
+ _memberSubscriptionEndedAdminEmailService = new MemberSubscriptionEndedAdminEmailService(
+ _userManager, _emailService, _memberLookup);
+ }
- [Fact]
- public async Task SendsEmail()
- {
- _memberLookup.Setup(m => m.GetMemberByEmailAsync(It.IsAny())).ReturnsAsync(new Mock().Object);
- _userManager.Setup(u => u.GetUsersInRoleAsync(AuthConstants.Roles.ADMINISTRATORS)).ReturnsAsync(
- new List { new Mock().Object, new Mock().Object });
+ [Fact]
+ public async Task SendsEmail()
+ {
+ _memberLookup.GetMemberByEmailAsync(Arg.Any())
+ .Returns(Task.FromResult(Substitute.For()));
+ _userManager.GetUsersInRoleAsync(AuthConstants.Roles.ADMINISTRATORS)
+ .Returns(Task.FromResult>(new List { Substitute.For(), Substitute.For() }));
- string testEmail = "TestEmail";
- await _memberSubscriptionEndedAdminEmailService.SendMemberSubscriptionEndedEmailAsync(testEmail, null);
+ string testEmail = "TestEmail";
+ await _memberSubscriptionEndedAdminEmailService.SendMemberSubscriptionEndedEmailAsync(testEmail, null);
- _emailService.Verify(e => e.SendEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(2));
- }
+ await _emailService.Received(2)
+ .SendEmailAsync(Arg.Any(), Arg.Any(), Arg.Any());
+ }
}
diff --git a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/CreateInvitation.cs b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/CreateInvitation.cs
index 4e0485bd1..cfef99af9 100644
--- a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/CreateInvitation.cs
+++ b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/CreateInvitation.cs
@@ -3,35 +3,36 @@
using DevBetterWeb.Core.Entities;
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Services;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.NewMemberServiceTests;
public class CreateInvitation
{
- private readonly Mock> _memberRepository = new();
- private readonly Mock> _invitationRepository = new();
- private readonly Mock _userRoleMembershipService = new();
- private readonly Mock _paymentHandlerSubscription = new();
- private readonly Mock _emailService = new();
- private readonly Mock _memberRegistrationService = new();
- private readonly Mock> _logger = new();
-
- private readonly INewMemberService _newMemberService;
-
+ private readonly IRepository _invitationRepository = Substitute.For>();
+ private readonly IUserRoleMembershipService _userRoleMembershipService = Substitute.For();
+ private readonly IPaymentHandlerSubscription _paymentHandlerSubscription =
+ Substitute.For();
+ private readonly IEmailService _emailService = Substitute.For();
+ private readonly IMemberRegistrationService _memberRegistrationService = Substitute.For();
+ private readonly IAppLogger _logger = Substitute.For>();
+ private readonly INewMemberService _newMemberService;
+ private readonly MemberAddBillingActivityService _memberAddBillingActivityService =
+ Substitute.For();
+
private readonly string _email = "TestEmail";
private readonly string _subscriptionId = "TestSubscriptionId";
public CreateInvitation()
{
- _newMemberService = new NewMemberService(_invitationRepository.Object,
- _userRoleMembershipService.Object,
- _paymentHandlerSubscription.Object,
- _emailService.Object,
- _memberRegistrationService.Object,
- _logger.Object,
- null!); // TODO: Add dependency
+ _newMemberService = new NewMemberService(_invitationRepository,
+ _userRoleMembershipService,
+ _paymentHandlerSubscription,
+ _emailService,
+ _memberRegistrationService,
+ _logger,
+ _memberAddBillingActivityService);
}
@@ -43,6 +44,6 @@ public async Task CreatesInvitationWithGivenEmailAndEventId()
Assert.Equal(_email, invitation.Email);
Assert.Equal(_subscriptionId, invitation.PaymentHandlerSubscriptionId);
- _invitationRepository.Verify(r => r.AddAsync(invitation, CancellationToken.None), Times.Once);
+ await _invitationRepository.Received(1).AddAsync(invitation, CancellationToken.None);
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/MemberSetup.cs b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/MemberSetup.cs
index 694ca7a67..c02ee820b 100644
--- a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/MemberSetup.cs
+++ b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/MemberSetup.cs
@@ -5,22 +5,25 @@
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Services;
using DevBetterWeb.Core.Specs;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.NewMemberServiceTests;
public class MemberSetup
{
- private readonly Mock> _memberRepository = new();
- private readonly Mock> _invitationRepository = new();
- private readonly Mock _userRoleMembershipService = new();
- private readonly Mock _paymentHandlerSubscription = new();
- private readonly Mock _emailService = new();
- private readonly Mock _memberRegistrationService = new();
- private readonly Mock> _logger = new();
- private readonly Mock _memberAddBillingActivityService = new();
+ private readonly IMemberAddBillingActivityService _memberAddBillingActivityService = Substitute.For();
+ private readonly IRepository _memberRepository = Substitute.For>();
+ private readonly IRepository _invitationRepository = Substitute.For>();
+ private readonly IUserRoleMembershipService _userRoleMembershipService = Substitute.For();
+ private readonly IPaymentHandlerSubscription _paymentHandlerSubscription =
+ Substitute.For();
+ private readonly IEmailService _emailService = Substitute.For();
+ private readonly IMemberRegistrationService _memberRegistrationService = Substitute.For();
+ private readonly IAppLogger _logger = Substitute.For>();
+
+
private readonly INewMemberService _newMemberService;
private readonly string _userId = "TestUserId";
@@ -36,13 +39,13 @@ public class MemberSetup
public MemberSetup()
{
- _newMemberService = new NewMemberService(_invitationRepository.Object,
- _userRoleMembershipService.Object,
- _paymentHandlerSubscription.Object,
- _emailService.Object,
- _memberRegistrationService.Object,
- _logger.Object,
- _memberAddBillingActivityService.Object);
+ _newMemberService = new NewMemberService(_invitationRepository,
+ _userRoleMembershipService,
+ _paymentHandlerSubscription,
+ _emailService,
+ _memberRegistrationService,
+ _logger,
+ _memberAddBillingActivityService);
_invitation = new Invitation(_email, _inviteCode, _subscriptionId);
}
@@ -52,17 +55,18 @@ public async Task SetsUpNewMember()
var memberResult = new Member();
var memberId = memberResult.Id;
- _invitationRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(_invitation);
- _invitationRepository.Setup(r => r.ListAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(new List());
- _memberRepository.Setup(r => r.GetByIdAsync(memberId, CancellationToken.None)).ReturnsAsync(memberResult);
- _memberRegistrationService.Setup(r => r.RegisterMemberAsync(_userId)).ReturnsAsync(memberResult);
+ _invitationRepository.FirstOrDefaultAsync(Arg.Any(), CancellationToken.None)!.Returns(Task.FromResult(_invitation));
+ _invitationRepository.ListAsync(Arg.Any(), CancellationToken.None).Returns(Task.FromResult(new List()) );
+ _memberRepository.GetByIdAsync(memberId, CancellationToken.None)!.Returns(Task.FromResult(memberResult));
+ _memberRegistrationService.RegisterMemberAsync(_userId).Returns(Task.FromResult(memberResult));
Member member = await _newMemberService.MemberSetupAsync(_userId, _firstName, _lastName, _inviteCode, "");
Assert.Equal(_firstName, member.FirstName);
Assert.Equal(_lastName, member.LastName);
- _userRoleMembershipService.Verify(u => u.AddUserToRoleByRoleNameAsync(_userId, _roleName), Times.Once);
+ await _userRoleMembershipService.Received(1)
+ .AddUserToRoleByRoleNameAsync(_userId, _roleName);
Assert.False(_invitation.Active);
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/SendRegistrationEmail.cs b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/SendRegistrationEmail.cs
index 0b64f348e..f0e8e171b 100644
--- a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/SendRegistrationEmail.cs
+++ b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/SendRegistrationEmail.cs
@@ -2,20 +2,24 @@
using DevBetterWeb.Core.Entities;
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Services;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.NewMemberServiceTests;
public class SendRegistrationEmail
{
- private readonly Mock> _memberRepository = new();
- private readonly Mock> _invitationRepository = new();
- private readonly Mock _userRoleMembershipService = new();
- private readonly Mock _paymentHandlerSubscription = new();
- private readonly Mock _emailService = new();
- private readonly Mock _memberRegistrationService = new();
- private readonly Mock> _logger = new();
+ private readonly IRepository _memberRepository = Substitute.For>();
+ private readonly IRepository _invitationRepository = Substitute.For>();
+ private readonly IUserRoleMembershipService _userRoleMembershipService = Substitute.For();
+ private readonly IPaymentHandlerSubscription _paymentHandlerSubscription =
+ Substitute.For();
+ private readonly IEmailService _emailService = Substitute.For();
+ private readonly IMemberRegistrationService _memberRegistrationService = Substitute.For();
+ private readonly IAppLogger _logger = Substitute.For>();
+
+ private readonly MemberAddBillingActivityService _memberAddBillingActivityService =
+ Substitute.For();
private readonly INewMemberService _newMemberService;
@@ -27,13 +31,13 @@ public class SendRegistrationEmail
public SendRegistrationEmail()
{
- _newMemberService = new NewMemberService(_invitationRepository.Object,
- _userRoleMembershipService.Object,
- _paymentHandlerSubscription.Object,
- _emailService.Object,
- _memberRegistrationService.Object,
- _logger.Object,
- null!); // TODO: Add dependency
+ _newMemberService = new NewMemberService(_invitationRepository,
+ _userRoleMembershipService,
+ _paymentHandlerSubscription,
+ _emailService,
+ _memberRegistrationService,
+ _logger,
+ _memberAddBillingActivityService);
_invitation = new Invitation(_email, _inviteCode, _subscriptionId);
}
@@ -43,7 +47,8 @@ public async Task SendsRegistrationEmail()
{
await _newMemberService.SendRegistrationEmailAsync(_invitation);
- _emailService.Verify(e => e.SendEmailAsync(_email, It.IsAny(), It.IsAny()), Times.Once);
+ await _emailService.Received(1)
+ .SendEmailAsync(_email, Arg.Any(), Arg.Any());
}
}
diff --git a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/VerifyValidEmailAndInviteCode.cs b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/VerifyValidEmailAndInviteCode.cs
index 5fa2b737f..880641110 100644
--- a/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/VerifyValidEmailAndInviteCode.cs
+++ b/tests/DevBetterWeb.Tests/Services/NewMemberServiceTests/VerifyValidEmailAndInviteCode.cs
@@ -4,97 +4,117 @@
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Services;
using DevBetterWeb.Core.Specs;
-using Moq;
+using NSubstitute;
using Xunit;
namespace DevBetterWeb.Tests.Services.NewMemberServiceTests;
public class VerifyValidEmailAndInviteCode
{
- private readonly Mock> _memberRepository = new();
- private readonly Mock> _invitationRepository = new();
- private readonly Mock _userRoleMembershipService = new();
- private readonly Mock _paymentHandlerSubscription = new();
- private readonly Mock _emailService = new();
- private readonly Mock _memberRegistrationService = new();
- private readonly Mock> _logger = new();
-
- private readonly INewMemberService _newMemberService;
-
- private readonly string _email = "TestEmail";
- private readonly string _inviteCode = "TestInviteCode";
- private readonly string _subscriptionId = "TestSubscriptionId";
-
- private readonly string _validEmailAndInviteCodeString = "success";
- private readonly string _invalidEmailString = "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvalidEmailException";
- private readonly string _invalidInviteCodeString = "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvitationNotFoundException";
- private readonly string _inactiveInviteString = "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvitationNotActiveException";
-
- public VerifyValidEmailAndInviteCode()
- {
- _newMemberService = new NewMemberService(_invitationRepository.Object,
- _userRoleMembershipService.Object,
- _paymentHandlerSubscription.Object,
- _emailService.Object,
- _memberRegistrationService.Object,
- _logger.Object,
- null!); // TODO: Add dependency
- }
-
- [Fact]
- public async Task ReturnsSuccessGivenValidEmailAndInviteCode()
- {
- var invitation = new Invitation(_email, _inviteCode, _subscriptionId);
-
- _invitationRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(invitation);
-
- var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
-
- _invitationRepository.Verify(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None), Times.Once);
- Assert.Equal(_validEmailAndInviteCodeString, result.Value);
- }
-
- [Fact]
- public async Task ReturnsExceptionMessageGivenInvalidEmail()
- {
- var invitation = new Invitation("", _inviteCode, _subscriptionId);
-
- _invitationRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(invitation);
-
- var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
-
- _invitationRepository.Verify(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None), Times.Once);
- Assert.Equal(_invalidEmailString, result.Value);
- }
-
- [Fact]
- public async Task ReturnsExceptionMessageGivenInvalidInviteCode()
- {
-
+ private readonly IRepository _memberRepository = Substitute.For>();
+ private readonly IRepository _invitationRepository = Substitute.For>();
+ private readonly IUserRoleMembershipService _userRoleMembershipService = Substitute.For();
+ private readonly IPaymentHandlerSubscription _paymentHandlerSubscription =
+ Substitute.For();
+ private readonly IEmailService _emailService = Substitute.For();
+ private readonly IMemberRegistrationService _memberRegistrationService = Substitute.For();
+ private readonly IAppLogger _logger = Substitute.For>();
+ private readonly MemberAddBillingActivityService _memberAddBillingActivityService =
+ Substitute.For();
+
+ private readonly INewMemberService _newMemberService;
+
+ private readonly string _email = "TestEmail";
+ private readonly string _inviteCode = "TestInviteCode";
+ private readonly string _subscriptionId = "TestSubscriptionId";
+
+ private readonly string _validEmailAndInviteCodeString = "success";
+
+ private readonly string _invalidEmailString =
+ "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvalidEmailException";
+
+ private readonly string _invalidInviteCodeString =
+ "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvitationNotFoundException";
+
+ private readonly string _inactiveInviteString =
+ "Invalid email or invite code: DevBetterWeb.Core.Exceptions.InvitationNotActiveException";
+
+ public VerifyValidEmailAndInviteCode()
+ {
+ _newMemberService = new NewMemberService(_invitationRepository,
+ _userRoleMembershipService,
+ _paymentHandlerSubscription,
+ _emailService,
+ _memberRegistrationService,
+ _logger,
+ _memberAddBillingActivityService);
+ }
+
+ [Fact]
+ public async Task ReturnsSuccessGivenValidEmailAndInviteCode()
+ {
+ var invitation = new Invitation(_email, _inviteCode, _subscriptionId);
+
+ _invitationRepository
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None)!
+ .Returns(Task.FromResult(invitation));
+
+ var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
+
+ await _invitationRepository.Received(1)
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None);
+ Assert.Equal(_validEmailAndInviteCodeString, result.Value);
+ }
+
+ [Fact]
+ public async Task ReturnsExceptionMessageGivenInvalidEmail()
+ {
+ var invitation = new Invitation("", _inviteCode, _subscriptionId);
+
+ _invitationRepository
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None)!
+ .Returns(Task.FromResult(invitation) );
+
+ var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
+
+ await _invitationRepository.Received(1)
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None);
+ Assert.Equal(_invalidEmailString, result.Value);
+ }
+
+ [Fact]
+ public async Task ReturnsExceptionMessageGivenInvalidInviteCode()
+ {
#pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types.
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type.
- _ = _invitationRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync((Invitation)null);
+ _ = _invitationRepository
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None)
+ .Returns( Task.FromResult((Invitation)null));
#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type.
#pragma warning restore CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types.
- var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
+ var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
- _invitationRepository.Verify(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None), Times.Once);
- Assert.Equal(_invalidInviteCodeString, result.Value);
- }
+ await _invitationRepository.Received(1)
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None);
+ Assert.Equal(_invalidInviteCodeString, result.Value);
+ }
- [Fact]
- public async Task ReturnsExceptionMessageGivenInactiveInviteCode()
- {
- Invitation _invitation = new Invitation(_email, _inviteCode, _subscriptionId);
+ [Fact]
+ public async Task ReturnsExceptionMessageGivenInactiveInviteCode()
+ {
+ Invitation _invitation = new Invitation(_email, _inviteCode, _subscriptionId);
- _invitation.Deactivate();
+ _invitation.Deactivate();
- _invitationRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(_invitation);
+ _invitationRepository
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None)
+ .Returns(Task.FromResult(_invitation));
- var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
+ var result = await _newMemberService.VerifyValidEmailAndInviteCodeAsync(_email, _inviteCode);
- _invitationRepository.Verify(r => r.FirstOrDefaultAsync(It.IsAny(), CancellationToken.None), Times.Once);
- Assert.Equal(_inactiveInviteString, result.Value);
- }
+ await _invitationRepository.Received(1)
+ .FirstOrDefaultAsync(Arg.Any(), CancellationToken.None);
+ Assert.Equal(_inactiveInviteString, result.Value);
+ }
}
diff --git a/tests/DevBetterWeb.UnitTests/DevBetterWeb.UnitTests.csproj b/tests/DevBetterWeb.UnitTests/DevBetterWeb.UnitTests.csproj
index cb14d440e..712a1e4a8 100644
--- a/tests/DevBetterWeb.UnitTests/DevBetterWeb.UnitTests.csproj
+++ b/tests/DevBetterWeb.UnitTests/DevBetterWeb.UnitTests.csproj
@@ -6,10 +6,8 @@
-
-
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/tests/DevBetterWeb.UnitTests/Infrastructure/Services/JsonParserServiceTests.cs b/tests/DevBetterWeb.UnitTests/Infrastructure/Services/JsonParserServiceTests.cs
index f1a12afc3..34f521346 100644
--- a/tests/DevBetterWeb.UnitTests/Infrastructure/Services/JsonParserServiceTests.cs
+++ b/tests/DevBetterWeb.UnitTests/Infrastructure/Services/JsonParserServiceTests.cs
@@ -2,19 +2,20 @@
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Infrastructure.Services;
using Microsoft.Extensions.Logging;
-using Moq;
using Xunit;
using FluentAssertions;
+using NSubstitute;
+using NSubstitute.ReceivedExtensions;
namespace DevBetterWeb.UnitTests.Infrastructure.Services;
public class JsonParserServiceTests
{
private readonly IJsonParserService _jsonParserService;
- private readonly Mock> _logger = new Mock>();
+ private readonly ILogger _logger = Substitute.For>();
public JsonParserServiceTests()
{
- this._jsonParserService = new JsonParserService(this._logger.Object);
+ this._jsonParserService = new JsonParserService(this._logger);
}
[Fact]
@@ -51,8 +52,9 @@ public void Parse_InvalidJson_LogsErrorMessage()
Assert.NotNull(ex);
}
- this._logger.VerifyLog(l => l.LogError($"Failed JSON parsing for: {invlaidJson}"));
- this._logger.VerifyLog(l => l.LogInformation("JSON parsing has failed"));
+ this._logger.Received().LogError(Arg.Any() ,$"Failed JSON parsing for: {invlaidJson}");
+ // this._logger.VerifyLog(l => l.LogInformation("JSON parsing has failed"));
+ this._logger.Received().LogInformation("JSON parsing has failed");
}
[Fact]
@@ -63,6 +65,8 @@ public void Parse_ValidJson_LogsSuccessInfoMessage()
var actualResult = this._jsonParserService.Parse(vlaidJson);
- this._logger.VerifyLog(l => l.LogInformation("JSON parsing is successful"));
+ // this._logger.VerifyLog(l => l.LogInformation("JSON parsing is successful"));
+ this._logger.Received().LogInformation("JSON parsing is successful");
+
}
}
diff --git a/tests/DevBetterWeb.UnitTests/Web/Services/BookServiceTests/GetAllBooksAsync.cs b/tests/DevBetterWeb.UnitTests/Web/Services/BookServiceTests/GetAllBooksAsync.cs
index 3543178f9..8bd6970f8 100644
--- a/tests/DevBetterWeb.UnitTests/Web/Services/BookServiceTests/GetAllBooksAsync.cs
+++ b/tests/DevBetterWeb.UnitTests/Web/Services/BookServiceTests/GetAllBooksAsync.cs
@@ -1,47 +1,50 @@
using System.Collections.Generic;
using System.Threading;
-using Xunit;
-using Moq;
using System.Threading.Tasks;
using DevBetterWeb.Core.Entities;
-using DevBetterWeb.Web.Services;
using DevBetterWeb.Core.Interfaces;
using DevBetterWeb.Core.Specs;
+using DevBetterWeb.Web.Services;
+using NSubstitute;
+using NSubstitute.ExceptionExtensions;
+using Xunit;
namespace DevBetterWeb.UnitTests.Web.Services.FilteredBookDetailsTests;
public class GetAllBooksAsync
{
- private readonly Mock> _bookRepositoryMock;
+ private readonly IRepository _bookRepositoryMock;
private readonly BookService _bookService;
public GetAllBooksAsync()
{
- _bookRepositoryMock = new Mock>();
- _bookService = new BookService(_bookRepositoryMock.Object);
+ _bookRepositoryMock = Substitute.For>();
+ _bookService = new BookService(_bookRepositoryMock);
}
[Fact]
public async Task GetsAllBooks()
{
// Arrange
- var expectedBooks = new List {
- new Book { Title = "Book1", Author = "Author1" },
- new Book { Title = "Book2", Author = "Author2" }
+ var expectedBooks = new List
+ {
+ new Book { Title = "Book1", Author = "Author1" }, new Book { Title = "Book2", Author = "Author2" }
};
- _bookRepositoryMock.Setup(repo => repo.ListAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(expectedBooks);
+ _bookRepositoryMock.ListAsync(Arg.Any(), Arg.Any())
+ .Returns(expectedBooks);
// Act
var actualBooksViewModel = await _bookService.GetAllBooksAsync();
// Assert
- _bookRepositoryMock.Verify(repo => repo.ListAsync(It.IsAny(), CancellationToken.None), Times.Once);
+ await _bookRepositoryMock.Received(1).ListAsync(Arg.Any(), Arg.Any());
Assert.Equal(expectedBooks.Count, actualBooksViewModel.Count);
foreach (var expectedBook in expectedBooks)
{
- Assert.Contains(actualBooksViewModel, bvm => bvm.Title == expectedBook.Title && bvm.Author == expectedBook.Author);
+ Assert.Contains(actualBooksViewModel,
+ bvm => bvm.Title == expectedBook.Title && bvm.Author == expectedBook.Author);
}
}
@@ -49,13 +52,14 @@ public async Task GetsAllBooks()
public async Task ReturnsEmptyListGivenNoBooks()
{
// Arrange
- _bookRepositoryMock.Setup(repo => repo.ListAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(new List());
+ _bookRepositoryMock.ListAsync(Arg.Any(), Arg.Any())
+ .Returns(new List());
// Act
var actualBooksViewModel = await _bookService.GetAllBooksAsync();
// Assert
- _bookRepositoryMock.Verify(repo => repo.ListAsync(It.IsAny(), CancellationToken.None), Times.Once);
+ await _bookRepositoryMock.Received(1).ListAsync(Arg.Any(), Arg.Any());
Assert.Empty(actualBooksViewModel);
}
@@ -66,44 +70,29 @@ public async Task ReturnsBooksInCorrectOrder()
// Arrange
var book1 = new Book
{
- Title = "Book1",
- Author = "Author1",
- MembersWhoHaveRead = new List
- {
- new Member(),
- },
- BookCategoryId = 1
+ Title = "Book1", Author = "Author1", MembersWhoHaveRead = new List { new Member(), }, BookCategoryId = 1
};
var book2 = new Book
{
Title = "Book2",
Author = "Author2",
- MembersWhoHaveRead = new List
- {
- new Member(),
- new Member(),
- },
+ MembersWhoHaveRead = new List { new Member(), new Member(), },
BookCategoryId = 1
};
var book3 = new Book
{
- Title = "Book3",
- Author = "Author3",
- MembersWhoHaveRead = new List
- {
- new Member(),
- },
- BookCategoryId = 2
+ Title = "Book3", Author = "Author3", MembersWhoHaveRead = new List { new Member(), }, BookCategoryId = 2
};
var expectedBooks = new List { book1, book2, book3 };
- _bookRepositoryMock.Setup(repo => repo.ListAsync(It.IsAny(), CancellationToken.None)).ReturnsAsync(expectedBooks);
+ _bookRepositoryMock.ListAsync(Arg.Any(), Arg.Any())
+ .Returns(expectedBooks);
// Act
var actualBooksViewModel = await _bookService.GetAllBooksAsync();
// Assert
- _bookRepositoryMock.Verify(repo => repo.ListAsync(It.IsAny(), CancellationToken.None), Times.Once);
+ await _bookRepositoryMock.Received(1).ListAsync(Arg.Any(), Arg.Any());
Assert.Equal(expectedBooks.Count, actualBooksViewModel.Count);
Assert.Equal(book2.Title, actualBooksViewModel[0].Title); // Book2 has higher ReadsCount
@@ -115,7 +104,8 @@ public async Task ReturnsBooksInCorrectOrder()
public async Task ThrowsExceptionWhenRepositoryFails()
{
// Arrange
- _bookRepositoryMock.Setup(repo => repo.ListAsync(It.IsAny(), CancellationToken.None)).ThrowsAsync(new System.Exception());
+ _bookRepositoryMock.ListAsync(Arg.Any(), Arg.Any())
+ .Throws(new System.Exception());
// Act & Assert
await Assert.ThrowsAsync(() => _bookService.GetAllBooksAsync());
diff --git a/tests/DevBetterWeb.UnitTests/Web/Services/FilteredBookDetailsTests/GetBookDetailsAsync.cs b/tests/DevBetterWeb.UnitTests/Web/Services/FilteredBookDetailsTests/GetBookDetailsAsync.cs
index 0c18f1ec9..4f1f7e991 100644
--- a/tests/DevBetterWeb.UnitTests/Web/Services/FilteredBookDetailsTests/GetBookDetailsAsync.cs
+++ b/tests/DevBetterWeb.UnitTests/Web/Services/FilteredBookDetailsTests/GetBookDetailsAsync.cs
@@ -2,7 +2,7 @@
using System.Threading;
using DevBetterWeb.Web.Interfaces;
using Xunit;
-using Moq;
+using NSubstitute;
using System.Threading.Tasks;
using DevBetterWeb.Core.Entities;
using DevBetterWeb.Infrastructure.Interfaces;
@@ -13,15 +13,15 @@ namespace DevBetterWeb.UnitTests.Web.Services.FilteredBookDetailsTests;
public class GetBookDetailsAsync
{
- private readonly Mock _nonCurrentMembersServiceMock;
- private readonly Mock _bookServiceMock;
+ private readonly INonCurrentMembersService _nonCurrentMembersServiceMock;
+ private readonly IBookService _bookServiceMock;
private readonly FilteredBookDetailsService _filteredBookDetailsService;
public GetBookDetailsAsync()
{
- _nonCurrentMembersServiceMock = new Mock();
- _bookServiceMock = new Mock();
- _filteredBookDetailsService = new FilteredBookDetailsService(_nonCurrentMembersServiceMock.Object, _bookServiceMock.Object);
+ _nonCurrentMembersServiceMock = Substitute.For();
+ _bookServiceMock = Substitute.For();
+ _filteredBookDetailsService = new FilteredBookDetailsService(_nonCurrentMembersServiceMock, _bookServiceMock);
}
[Fact]
@@ -29,7 +29,7 @@ public async Task ReturnsNullGivenNonExistentBookId()
{
// Arrange
var bookId = "1";
- _bookServiceMock.Setup(s => s.GetBookByIdAsync(int.Parse(bookId))).ReturnsAsync((BookDetailsViewModel?)null);
+ _bookServiceMock.GetBookByIdAsync(int.Parse(bookId)).Returns((BookDetailsViewModel?)null);
// Act
var result = await _filteredBookDetailsService.GetBookDetailsAsync(bookId);
@@ -44,7 +44,7 @@ public async Task ReturnBookDetailsGivenValidBookId()
// Arrange
var bookId = "1";
var bookDetails = new BookDetailsViewModel();
- _bookServiceMock.Setup(s => s.GetBookByIdAsync(int.Parse(bookId))).ReturnsAsync(bookDetails);
+ _bookServiceMock.GetBookByIdAsync(int.Parse(bookId)).Returns(bookDetails);
// Act
var result = await _filteredBookDetailsService.GetBookDetailsAsync(bookId);
@@ -67,9 +67,10 @@ public async Task FilterNonCurrentMembersGivenValidBookId()
{
MembersWhoHaveRead = new List { new Member { Id = 1 } }
};
- _bookServiceMock.Setup(s => s.GetBookByIdAsync(int.Parse(bookId))).ReturnsAsync(bookDetails);
- _nonCurrentMembersServiceMock.Setup(s => s.GetUsersIdsWithoutRolesAsync()).ReturnsAsync(new List { "2", "3" });
- _nonCurrentMembersServiceMock.Setup(s => s.GetNonCurrentMembersAsync(It.IsAny