无法实例化代理..找不到无参数构造函数



我正试图使用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:UsersTimDocumentsVisual Studio 2013ProjectsPreRegistrationAppMVC_TestsIdentityAccountsAccountController_Test.cs:line 108
  InnerException: 

我对Moq完全陌生,所以我正在寻找:Moq需要什么类型的设置来实例化它?UserStore类是否有什么地方不能很好地与Moq配合使用?

感谢阅读。

MOQ适合模拟接口,但不能很好地与具体类配合使用。因此,与其嘲笑具体的课堂,不如要求一个界面:

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

此外,ApplicationUser应该是POCO,所以不需要模拟它,只需创建它的实例而不需要MOQ并在测试中使用即可。

您可以尝试引用Mock行为,如下所示

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

我知道这是一个延迟响应,但我一直在寻找答案,但找不到我需要的确切内容,但在创建mock时,可以将参数传递给您想要的构造函数。

例如,如果你有这样的类:

public class Foo
{
    private readonly Boo _boo;
    public Foo(Boo boo)
    {
        _boo = boo;
    }
}

你可以这样嘲笑它:

private readonly Mock<Foo> _foo = new Mock<Foo>(new Mock<Boo>().Object);

我遇到了这个问题。我写过。。。

var x = new Mock<Concrete>();

而不是

var x = new Mock<IConcrete>();

ApplicationUser类添加一个空构造函数。

相关内容

  • 没有找到相关文章

最新更新