using AutoMapper;
using End.Microservice.Financing.Application.Commands.Abstract;
using End.Microservice.Financing.Application.Models;
using End.Microservice.Financing.Persistence;
using Microsoft.Extensions.Logging;
namespace End.Microservice.Financing.Application.Commands.PaymentPlan.Create;
public class CreatePaymentPlanRequestHandler : CreateRequestHandler<PaymentPlanModel, Domain.PaymentPlan>
{
public CreatePaymentPlanRequestHandler(
ILogger<CreateRequest<PaymentPlanModel>> logger,
FinanceDbContext dbContext,
IMapper mapper
) : base(logger, dbContext, mapper)
{
}
public override async Task<PaymentPlanModel> Handle(CreateRequest<PaymentPlanModel> request, CancellationToken cancellationToken)
{
return await Create(request, DbContext.PaymentPlans, cancellationToken);
}
}
using AutoMapper;
using End.Microservice.Financing.Application.Common;
using End.Microservice.Financing.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace End.Microservice.Financing.Application.Commands.Abstract;
public abstract class CreateRequestHandler<TModel, TEntity> : RequestHandler<CreateRequest<TModel>, TModel, FinanceDbContext> where TEntity : class
{
protected CreateRequestHandler(
ILogger<CreateRequest<TModel>> logger,
FinanceDbContext dbContext,
IMapper mapper
) : base(
logger,
dbContext,
mapper
) { }
public async Task<TModel> Create(CreateRequest<TModel> request, DbSet<TEntity> table, CancellationToken cancellationToken)
{
// Convert the request payload into an entity.
var mappedEntity = Mapper.Map<TEntity>(request.Model);
// Add the entity to the DB context.
var entry = table.Add(mappedEntity);
// Save the DB context changes.
await DbContext.SaveChangesAsync(cancellationToken);
// Map the saved entity back to a model and return it.
return Mapper.Map<TModel>(entry.Entity);
}
}
I am trying to create Unit test for the Above CreatePaymentPlanRequestHandler
using AutoMapper;
using End.Microservice.Core.Infrastructure.Services.Interfaces;
using End.Microservice.Financing.Application.Commands.Abstract;
using End.Microservice.Financing.Application.Commands.PaymentPlan.Create;
using End.Microservice.Financing.Application.Commands.PaymentPlan.Patch;
using End.Microservice.Financing.Application.Models;
using End.Microservice.Financing.Config.Settings;
using End.Microservice.Financing.Persistence;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Moq;
namespace End.Microservice.Financing.Tests.Application.Commands.PaymentPlan.Create
{
public class CreatePaymentPlanRequestHandlerTests
{
private readonly CreatePaymentPlanRequestHandler _handler;
private readonly Mock<ILogger<CreateRequest<PaymentPlanModel>>> _loggerMock;
private readonly Mock<FinanceDbContext> _dbContextMock;
private readonly Mock<IMapper> _mapperMock;
private readonly CreateRequest<PaymentPlanModel> _request;
private Mock<DbContextOptions<FinanceDbContext>> _dbcontextoptions;
private Mock<IOptionsSnapshot<Settings>> _optionSettings;
private new Mock<ITimeService> _timeService;
private Mock<IUserService> _userService;
private Mock<IMediator> _mediator;
private Mock<IHashService> _hashservice;
public CreatePaymentPlanRequestHandlerTests()
{
_dbcontextoptions = new Mock<DbContextOptions<FinanceDbContext>>();
_optionSettings = new Mock<IOptionsSnapshot<Settings>>();
_timeService = new Mock<ITimeService>();
_userService = new Mock<IUserService>();
_mediator = new Mock<IMediator>();
_hashservice = new Mock<IHashService>();
_loggerMock = new Mock<ILogger<CreateRequest<PaymentPlanModel>>>();
_mapperMock = new Mock<IMapper>();
var settings = new Settings
{
Version = "1.0",
Environment = "Development",
ConnectionStrings = new ConnectionStringsSettings
{
Finance = "MyConnectionString"
}
};
var options = new DbContextOptionsBuilder<FinanceDbContext>()
.Options;
var settingsOptions = Options.Create(settings);
var settingsSnapshotMock = new Mock<IOptionsSnapshot<Settings>>();
settingsSnapshotMock.Setup(x => x.Value).Returns(settings);
_dbContextMock = new Mock<FinanceDbContext>(options, settingsSnapshotMock.Object, _timeService.Object, _userService.Object
, _mediator.Object, _hashservice.Object);
_handler = new CreatePaymentPlanRequestHandler(
_loggerMock.Object,
_dbContextMock.Object,
_mapperMock.Object
);
_request = new CreateRequest<PaymentPlanModel>
{
Model = new PaymentPlanModel()
{
Account = "1234567890",
PolicyNumber = "111",
PolicyPaymentAmount = 20,
PolicyCity = "Thrissur",
PolicyCompany = "xyz",
PolicyCountryCode = "2",
PolicyEmail = "[email protected]",
PolicyFirstName = "ash",
PolicyLastName = "involvz",
PolicyPhone = "9562019393",
PolicyPostalCode = "680517",
PolicyStateCode = "2",
PolicyStreet = "kunnamkulam",
ContractAdminCost = 10,
ContractSellingAgentId = 4,
ContractAdministratorId = 3,
ContractDownPayment = 1,
ContractId = "2",
ContractStatusId = 1,
ContractTotalSalePrice = 20,
FinanceFee = 20,
LastPaymentPlanAtemptDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAttemptResultId = 1,
LastPaymentPlanAdjustmentDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAdjustmentTypeId = 1,
NextPaymentDate = DateTime.Now.AddDays(1),
NumberOfDeferredPayments = 1,
NumberOfDueDateChanges = 1,
NumberOfLateFeesWaived = 1,
NumberOfLateFeesAssesses = 1,
NumberOfNSFFeesAssesses = 1,
NumberOfNSFFeesWaived = 1,
NumberOfReinstatements = 1,
NextPaymentId = 1,
NextPaymentReminderDate = DateTime.Now.AddDays(-2),
Occurrences = 1,
PaymentMethodId = 10,
PaymentPlanAdjustmentDate = DateTime.Now.AddDays(-2),
PaymentPlanAdjustmentTypeId = 1,
PaymentPlanTotalAmount = 20,
PaymentPlanBalance = 10,
PaymentPlanBillingFrequencyId = 1,
PaymentPlanCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanCancelReasonId = 0,
PaymentPlanDefunded = true,
PaymentPlanDefundedAdmin = 1,
PaymentPlanDefundedAgent = 1,
PaymentPlanFundedDate = DateTime.Now.AddDays(-2),
PaymentPlanFunded = true,
PaymentPlanFundedAdmin = 1,
PaymentPlanFundedAgent = 1,
PaymentPlanNumber = 1,
PaymentPlanPendingCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanStartDate = DateTime.Now.AddDays(-2),
PaymentPlanStatus = 1,
PaymentPlanTotalLateFees = 1,
PaymentPlanTotalNSFFees = 1,
PaymentsMade = 10,
PaymentsRemaining = 2,
PaymentProcessDay = 2,
ProductSoldId = 1,
SecondaryContactEmail = "[email protected]",
SecondaryContactFirstName = "xy",
SecondaryContactLastName = "yy",
SecondaryContactPhone = "9447772010",
TotalDiscountsApplied = 2,
PaymentPlanTerm = 2
}
};
}
[Fact]
public async Task Handle_ValidRequest_ReturnsCreatedPaymentPlan()
{
// Arrange
var cancellationToken = new CancellationToken();
var paymentPlanEntity = new Domain.PaymentPlan();
var savedPaymentPlanEntity = new Domain.PaymentPlan
{
Id = 1,
Account = "1234567890",
PolicyNumber = "111",
PolicyPaymentAmount = 20,
PolicyCity = "Thrissur",
PolicyCompany = "xyz",
PolicyCountryCode = "2",
PolicyEmail = "[email protected]",
PolicyFirstName = "ash",
PolicyLastName = "involvz",
PolicyPhone = "9562019393",
PolicyPostalCode = "680517",
PolicyStateCode = "2",
PolicyStreet = "kunnamkulam",
ContractAdminCost = 10,
ContractSellingAgentId = 4,
ContractAdministratorId = 3,
ContractDownPayment = 1,
ContractId = "2",
ContractStatusId = 1,
ContractTotalSalePrice = 20,
FinanceFee = 20,
LastPaymentPlanAtemptDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAttemptResultId = 1,
LastPaymentPlanAdjustmentDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAdjustmentTypeId = 1,
NextPaymentDate = DateTime.Now.AddDays(1),
NumberOfDeferredPayments = 1,
NumberOfDueDateChanges = 1,
NumberOfLateFeesWaived = 1,
NumberOfLateFeesAssesses = 1,
NumberOfNSFFeesAssesses = 1,
NumberOfNSFFeesWaived = 1,
NumberOfReinstatements = 1,
NextPaymentId = 1,
NextPaymentReminderDate = DateTime.Now.AddDays(-2),
Occurrences = 1,
PaymentMethodId = 10,
PaymentPlanAdjustmentDate = DateTime.Now.AddDays(-2),
PaymentPlanAdjustmentTypeId = 1,
PaymentPlanTotalAmount = 20,
PaymentPlanBalance = 10,
PaymentPlanBillingFrequencyId = 1,
PaymentPlanCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanCancelReasonId = 0,
PaymentPlanDefunded = true,
PaymentPlanDefundedAdmin = 1,
PaymentPlanDefundedAgent = 1,
PaymentPlanFundedDate = DateTime.Now.AddDays(-2),
PaymentPlanFunded = true,
PaymentPlanFundedAdmin = 1,
PaymentPlanFundedAgent = 1,
PaymentPlanNumber = 1,
PaymentPlanPendingCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanStartDate = DateTime.Now.AddDays(-2),
PaymentPlanStatus = 1,
PaymentPlanTotalLateFees = 1,
PaymentPlanTotalNSFFees = 1,
PaymentsMade = 10,
PaymentsRemaining = 2,
PaymentProcessDay = 2,
ProductSoldId = 1,
SecondaryContactEmail = "[email protected]",
SecondaryContactFirstName = "xy",
SecondaryContactLastName = "yy",
SecondaryContactPhone = "9447772010",
TotalDiscountsApplied = 2,
PaymentPlanTerm = 2
};
var savedPaymentPlanModel = new PaymentPlanModel
{
Account = "1234567890",
PolicyNumber = "111",
PolicyPaymentAmount = 20,
PolicyCity = "Thrissur",
PolicyCompany = "xyz",
PolicyCountryCode = "2",
PolicyEmail = "[email protected]",
PolicyFirstName = "ash",
PolicyLastName = "involvz",
PolicyPhone = "9562019393",
PolicyPostalCode = "680517",
PolicyStateCode = "2",
PolicyStreet = "kunnamkulam",
ContractAdminCost = 10,
ContractSellingAgentId = 4,
ContractAdministratorId = 3,
ContractDownPayment = 1,
ContractId = "2",
ContractStatusId = 1,
ContractTotalSalePrice = 20,
FinanceFee = 20,
LastPaymentPlanAtemptDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAttemptResultId = 1,
LastPaymentPlanAdjustmentDate = DateTime.Now.AddDays(-1),
LastPaymentPlanAdjustmentTypeId = 1,
NextPaymentDate = DateTime.Now.AddDays(1),
NumberOfDeferredPayments = 1,
NumberOfDueDateChanges = 1,
NumberOfLateFeesWaived = 1,
NumberOfLateFeesAssesses = 1,
NumberOfNSFFeesAssesses = 1,
NumberOfNSFFeesWaived = 1,
NumberOfReinstatements = 1,
NextPaymentId = 1,
NextPaymentReminderDate = DateTime.Now.AddDays(-2),
Occurrences = 1,
PaymentMethodId = 10,
PaymentPlanAdjustmentDate = DateTime.Now.AddDays(-2),
PaymentPlanAdjustmentTypeId = 1,
PaymentPlanTotalAmount = 20,
PaymentPlanBalance = 10,
PaymentPlanBillingFrequencyId = 1,
PaymentPlanCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanCancelReasonId = 0,
PaymentPlanDefunded = true,
PaymentPlanDefundedAdmin = 1,
PaymentPlanDefundedAgent = 1,
PaymentPlanFundedDate = DateTime.Now.AddDays(-2),
PaymentPlanFunded = true,
PaymentPlanFundedAdmin = 1,
PaymentPlanFundedAgent = 1,
PaymentPlanNumber = 1,
PaymentPlanPendingCancelDate = DateTime.Now.AddDays(-2),
PaymentPlanStartDate = DateTime.Now.AddDays(-2),
PaymentPlanStatus = 1,
PaymentPlanTotalLateFees = 1,
PaymentPlanTotalNSFFees = 1,
PaymentsMade = 10,
PaymentsRemaining = 2,
PaymentProcessDay = 2,
ProductSoldId = 1,
SecondaryContactEmail = "[email protected]",
SecondaryContactFirstName = "xy",
SecondaryContactLastName = "yy",
SecondaryContactPhone = "9447772010",
TotalDiscountsApplied = 2,
PaymentPlanTerm = 2
};
var entityEntryMock = new Mock<EntityEntry<Domain.PaymentPlan>>();
entityEntryMock.Setup(e => e.Entity).Returns(paymentPlanEntity);
entityEntryMock.Setup(e => e.State).Returns(EntityState.Added);
_mapperMock.Setup(m => m.Map<Domain.PaymentPlan>(_request.Model)).Returns(paymentPlanEntity);
_dbContextMock.Setup(db => db.PaymentPlans.AddAsync(It.IsAny<Domain.PaymentPlan>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(entityEntryMock.Object);
_dbContextMock.Setup(db => db.SaveChangesAsync(It.IsAny<CancellationToken>()));
_mapperMock.Setup(m => m.Map<PaymentPlanModel>(savedPaymentPlanEntity)).Returns(savedPaymentPlanModel);
// Act
var result = await _handler.Handle(_request, cancellationToken);
// Assert
Assert.NotNull(result);
// Add more assertions as needed
}
}
}
But I am getting an error on setting up AddAsync method
End.Microservice.Financing.Tests.Application.Commands.PaymentPlan.Create.CreatePaymentPlanRequestHandlerTests.Handle_ValidRequest_ReturnsCreatedPaymentPlan
Source: PaymentPlanUnitTests.cs line 284
Duration: 20.3 sec
Message:
System.ArgumentException : Can not instantiate proxy of class: Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry1[[End.Microservice.Financing.Domain.PaymentPlan, End.Microservice.Financing.Domain, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]]. Could not find a parameterless constructor. (Parameter 'constructorArguments') ---- System.MissingMethodException : Constructor on type 'Castle.Proxies.EntityEntry
1Proxy’ not found.
Stack Trace:
ProxyGenerator.CreateClassProxyInstance(Type proxyType, List1 proxyArguments, Type classToProxy, Object[] constructorArguments) ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors) CastleProxyFactory.CreateProxy(Type mockType, IInterceptor interceptor, Type[] interfaces, Object[] arguments) line 110 Mock
1.InitializeInstance() line 502
Mock1.OnGetObject() line 516 Mock.get_Object() line 180 Mock
1.get_Object() line 453
CreatePaymentPlanRequestHandlerTests.Handle_ValidRequest_ReturnsCreatedPaymentPlan() line 456
— End of stack trace from previous location —
—– Inner Stack Trace —–
RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
ProxyGenerator.CreateClassProxyInstance(Type proxyType, List1 proxyArguments, Type classToProxy, Object[] constructorArguments)
your text`
Preyag P P is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.