programing

프록시를 인스턴스화할 수 없습니다...매개 변수 없는 생성자를 찾을 수 없습니다.

itmemos 2023. 5. 7. 11:13
반응형

프록시를 인스턴스화할 수 없습니다...매개 변수 없는 생성자를 찾을 수 없습니다.

는 MongoDB를 테스트하는 Moq를 사용하여 유닛 테스트를 만들려고 합니다.AsNet.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로 잘 재생되지 않는 것이 있습니까?

읽어주셔서 감사합니다.

MOQ는 인터페이스를 조롱하는 데는 좋지만 구체적인 클래스에서는 잘 작동하지 않습니다.따라서 구체적인 수업을 조롱하는 대신 인터페이스를 요청합니다.

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

또한.ApplicationUserPOCO여야 하므로 조롱할 필요가 없으며 MOQ 없이 인스턴스를 만들어 테스트에 사용합니다.

아래와 같이 Mock 동작을 참조해 볼 수 있습니다.

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

저는 이런 문제가 있었습니다.내가 쓴 편지는...

var x = new Mock<Concrete>();

대신에

var x = new Mock<IConcrete>();

이것이 늦은 응답인 것은 알지만, 답변을 찾고 있었는데 정확히 필요한 것을 찾을 수 없었습니다. 하지만 모의실험을 만들 때 원하는 생성자에게 매개 변수를 전달할 수 있습니다.

예를 들어, 다음과 같은 클래스가 있습니다.

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

빈 생성자를 에 추가합니다.ApplicationUser학급.

언급URL : https://stackoverflow.com/questions/25649155/can-not-instantiate-proxy-could-not-find-a-parameterless-constructor

반응형