Подтвердить что ты не робот

Не удается создать прокси-сервер... Не удалось найти конструктор без параметров

Я пытаюсь создать unit test с помощью Moq, который тестирует поставщик MongoDB.AspNet.Identity V2. Эта линия дает мне горе:

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

Кажется, что userStore не будет корректно создаваться здесь, это ошибка.

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: 

Я совершенно не знаком с Moq, поэтому я ищу: Какие параметры нужны для Moq для создания экземпляра? Есть ли что-то в классе UserStore, который не будет хорошо работать с Moq?

Спасибо за чтение.

4b9b3361

Ответ 1

MOQ хорош для насмешек интерфейсов, но не работает так хорошо с конкретными классами. Поэтому вместо того, чтобы издеваться над конкретным классом, попросите inteface:

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

Также ApplicationUser должен быть POCO, поэтому не нужно его издеваться, просто создайте свой экземпляр без MOQ и используйте в тестах.

Ответ 2

Вы можете попробовать изменить поведение Mock, как показано ниже.

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

Ответ 3

У меня была эта проблема. Я написал...

var x = new Mock<Concrete>();

... вместо...

var x = new Mock<IConcrete>();