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.
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.
J'ai eu ce problème. J'avais écrit ...
var x = new Mock<Concrete>();
... au lieu de ...
var x = new Mock<IConcrete>();
Vous pouvez essayer de référencer le comportement Mock, comme indiqué ci-dessous
Mock<testClass>(MockBehavior.Strict, new object[] {"Hello"});