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

时间:2014-09-03 16:18:16

标签: mongodb moq asp.net-identity

我正在尝试使用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一起玩?

感谢阅读。

5 个答案:

答案 0 :(得分:27)

MOQ适用于模拟接口,但在具体类中效果不佳。因此,不要嘲笑具体的类,而是要求接口:

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

同样ApplicationUser应该是POCO,所以不需要模拟它,只需创建没有MOQ的实例并在测试中使用。

答案 1 :(得分:6)

我有这个问题。我写过......

var x = new Mock<Concrete>();

......而不是......

var x = new Mock<IConcrete>();

答案 2 :(得分:4)

您可以尝试参考Mock行为,如下所示

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

答案 3 :(得分:2)

我知道这是一个迟到的回复,但我一直在寻找答案并且找不到我需要的确切答案,但是在创建模拟时,您可以将参数传递给您想要的构造函数。

例如,如果您有这样的课程:

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);

答案 4 :(得分:-2)

向您的 { "orders": [ { id: 123456789, description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." }, { id: 789456123, description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." } ] } 类添加一个空构造函数。