web-dev-qa-db-fra.com

Impossible d'instancier le proxy ... Impossible de trouver un constructeur sans paramètre

J'essaie de créer un test unitaire en utilisant Moq qui teste le fournisseur MongoDB.AspNet.Identity V2 . Cette ligne me donne du chagrin:

var appUser = new Mock<PreRegistrationMVC.Models.ApplicationUser>();
var userStore = new Mock<MongoDB.AspNet.Identity.UserStore<PreRegistrationMVC.Models.ApplicationUser>>();

Il semble que le userStore n'instanciera pas correctement voici l'erreur.

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException was unhandled by user code
  HResult=-2147024809
  Message=Can not instantiate proxy of class: MongoDB.AspNet.Identity.UserStore`1[[MVC.Models.ApplicationUser, MVC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
Could not find a parameterless constructor.
  Source=Moq
  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.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
       at Moq.Mock`1.<InitializeInstance>b__2()
       at Moq.PexProtector.Invoke(Action action)
       at Moq.Mock`1.InitializeInstance()
       at Moq.Mock`1.OnGetObject()
       at Moq.Mock.GetObject()
       at Moq.Mock.get_Object()
       at Moq.Mock`1.get_Object()
       at MVC_Tests.Identity.Accounts.AccountController_Test.TestSuccessfulRegister() in c:\Users\Tim\Documents\Visual Studio 2013\Projects\PreRegistrationApp\MVC_Tests\Identity\Accounts\AccountController_Test.cs:line 108
  InnerException: 

Je suis complètement nouveau sur Moq et je recherche donc: Quels types de paramètres sont nécessaires pour que Moq instancie cela? Y a-t-il quelque chose à propos de la classe UserStore qui ne fonctionnera pas bien avec Moq?

Merci d'avoir lu.

23
ChiliYago

MOQ est bon pour se moquer des interfaces, mais ne fonctionne pas aussi bien avec des classes concrètes. Donc au lieu de se moquer de la classe concrète, demandez l’interface:

var userStore = new Mock<IUserStore<PreRegistrationMVC.Models.ApplicationUser>>();

ApplicationUser devrait également être POCO, donc pas besoin de se moquer de lui, il suffit de créer son instance sans MOQ et de l'utiliser dans les tests.

30
trailmax

J'ai eu ce problème. J'avais écrit ...

var x = new Mock<Concrete>();

... au lieu de ...

var x = new Mock<IConcrete>();
8
Remotec

Vous pouvez essayer de référencer le comportement Mock, comme indiqué ci-dessous

Mock<testClass>(MockBehavior.Strict, new object[] {"Hello"}); 
8
Ashraf Alam