How to Solve XUnit Automated Testing Error: Castle DynamicProxy InvalidProxyConstructorArgumentsException

How to Solve the XUnity Automated Test Error:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException
  HResult=0x80070057
  Message=Can not instantiate proxy of class: Database Context
Could not find a parameterless constructor.
  Source=Castle.Core
  StackTrace:
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyInstance(Type proxyType, List`1 proxyArguments, Type classToProxy, Object[] constructorArguments)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
   at Moq.CastleProxyFactory.CreateProxy(Type mockType, IInterceptor interceptor, Type[] interfaces, Object[] arguments)
   at Moq.Mock`1.InitializeInstance()
   at Moq.Mock`1.OnGetObject()
   at Moq.Mock.get_Object()
   at Moq.Mock`1.get_Object()

 

Answer: When this error happens while testing an Asp.Net Core 3.1 using XUnit Testing Framework, make sure you include the default values when creating a Database Context Constructor. There is a parameter preventing the Instatietion of the DbContext (Database Context). 

- Another way to resolve this is by creating an empty constructor in the DBContext Class, this way the instantiation of the DBContext class in XUnit Test Application won't throw an Error.

- However, if you want to use an existing DatabaseContext used in your Asp.Net Core 3.1 Application
   when testing an Asp.Net Core 3.1 Controller using XUnit Testing Framework then see the example below:

namespace XUnit_Test_Project_For_AspNetCore_3_1
{
    public class Pass_MyServiceRepository
    {
        [Fact]
        public void Should_Pass_GetById()
        {
            int id = 6;
            var imyinterface = new Mock<IMyInterface>();
            //Database Configuration
            var optionsBuilder = new DbContextOptionsBuilder<MyLovelyDBContextClass>();
            optionsBuilder.UseSqlServer("Server=ServerName;Database=NameOfDatabaseHere;Persist Security Info=True;User ID=UserName;Password=SecurePassword;MultipleActiveResultSets=True;");

          
            var mockSet = new Mock<DbSet<NameOfPocoModelClass>>();

            var mockContext = new Mock<MyLovelyDBContextClass>(optionsBuilder);

            mockContext.Setup(m => m.NameOfPocoModelClass).Returns(mockSet.Object);

            using (var context = new MyLovelyDBContextClass(optionsBuilder.Options))
            {
                var service = new SearchRepository(context, IMyInterface.Object);
                IEnumerable<NameOfPocoModelClass> list = service.GetById(id);
                Assert.NotNull(list);
            }

        }
    }
}
  • Dependencies: You will have to install the Moq Nuget Library for you to have a successful Testing of Asp.Net Core 3.1 using the XUnit Testing Framework.
  • [Note] XUnit Test Framework works well testing Asp.Net Core 3.1, it has been said that the Team at Microsoft that works on Asp.Net Core uses or prefer using XUnit for testing Internal Asp.Net Core API. This statement is not verified but it's worth keeping in mind when deciding what framework to use when testing Asp.Net Core.

    References: https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

Edit this Article
XUnit Testing Framework Asp.Net Core 3.1 XUnity Test Testing Asp.Net Core 3.1 Technology published
Was this page helpful?
Yes Yes! this solution to the problem was helpful. No No! this solution to the problem was not helpful.. Leave ErnesTech Feedback.Feedback
If you log in, you will be notified when someone leaves a comment.

Other users would like to know if this solution helped you.

Your Session is Ending
Login to Continue

© 2021 - ErnesTech - Privacy