MOQ

2014-04-18 4 views
11

와 구체적인 클래스를 조롱 할 때 인터페이스 인수 생성자를 호출하기 위해 어떻게해야 생성자 주입 사용하는 다음 클래스 : 나는 단순히 MOQ를 만들이 클래스의 대부분의 메소드에 대한MOQ

public class Service : IService 
{ 
    public Service(IRepository repository, IProvider provider) { ... } 
} 

IRepository에 대한 조롱과 IProviderService을 구성하십시오. 그러나 같은 클래스에서 다른 여러 메서드를 호출하는 클래스의 메서드가 하나 있습니다. 이 메서드를 테스트하기 위해 모든 메서드를 함께 테스트하는 대신 메서드가 해당 메서드를 올바르게 호출하고 반환 값을 올바르게 처리하는지 테스트하려고합니다.

가장 좋은 방법은 모의 Service입니다. 나는 전에 Moq과 구체적인 수업을 조롱했다. Moq와 함께 생성자 인수가 필요한 구체적인 클래스를 조롱했습니다. 그러나, 조롱 된 인수를 조롱 된 객체의 생성자에 전달해야 할 필요가있는 것은 이번이 처음입니다. 당연히이 방법으로 시도했습니다.

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

그러나 작동하지 않습니다. 대신에, 나는 다음과 같은 오류가 발생합니다 : Service의 생성자 int들과 string들처럼 간단한 인수를하는 경우,하지만 내가 조롱하고있어 인터페이스를 필요하지 않으면이 잘 작동

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service. 
Could not find a constructor that would match given arguments: 
    Castle.Proxies.IRepository 
    Castle.Proxies.IProvider 

. 어떻게 할 수 있니?

+1

어떤 Moq 및 Castle 버전을 사용하고 있습니까? 샘플 코드가 Moq 4.2.1312.1622 및 Castle.Core 3.2.2를 사용하여 잘 작동하기 때문에 ... – nemesv

답변

4

Service에 해당하는 내부 생성자가있을 때 매우 비슷한 문제가있어서 Moq에 표시되지 않았습니다.

내가 구현하는 프로젝트에 대한 내 AssemblyInfo.cs 파일에
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

을 추가했다. 관련성이 있는지 확신 할 수는 없지만 귀하 또는 다른 사람에게 도움이 될 수있는 기회를 제안했습니다.

1

이전 버전 문제 여야하며 모두 최신 버전이어야합니다. 닉, 확인해 봐!

필자 : 실수로 인해 현상금이 시작되었습니다 (생성자에 잘못된 서명이 있음).

3

왜 테스트중인 서비스를 조롱하고 있습니까? Service 클래스의 구현을 테스트하려는 경우 (조롱 된 객체에 대한 호출이든 아니든) 테스트 클래스가 아닌 두 인터페이스에 대한 모의 객체 만 있으면됩니다.

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

는이 대신해야하지 : 대신

?

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Service(repository.Object, provider.Object); 

가 나는 어떤 프레임 워크에서 구체적인 객체를 조롱하는 것을 깨닫게하지만 의도 된 목적은 무엇인가? 비웃음 뒤에 숨은 아이디어는 테스트에 영향을 미치지 않도록 실제 구현을 제거하는 것입니다. 그러나 귀하의 질문에, 귀하는 특정 수업이 적절히 요구된다는 사실을 알고 싶다고 말한 다음 그러한 행동의 결과를 확인하기를 원합니다. 그것은 의심 할 여지없이 구현을 테스트하고 있으며, 이러한 이유 때문에 구체적인 객체를 조롱하는 목표를 보는 데 어려움을 겪고 있습니다.