2012-03-05 6 views
2

이 메서드를 올바르게 조롱하는 방법을 알아낼 수 없습니다. 내가 조롱 할 방법은 다음과 같습니다 :파생 된 인수를 사용하여 메서드를 호출하는 중

public virtual void Publish<TEvent>(TEvent evt) where TEvent : IDomainEvent { 
    HandlerInvoker.Invoke(evt); 
} 

내가 조롱하려는 TEvent의 예는 다음과 같습니다 나는이 조롱 수 있어요

public interface IOrderPlaced : IDomainEvent {} 

내가 사용하는 경우 :

mock.Setup(h => h.Publish(It.IsAny<IOrderPlaced>)); 

그러나 IDomainEvent에서 파생 된 모든 인터페이스에 대한 메소드를 모의하고 싶습니다.

mock.Setup(h => h.Publish(It.IsAny<IDomainEvent>)); 

하지만 전혀 작동하지 않습니다. 특정 인터페이스를 사용하여 mock을 설정할 때만 작동합니다. 하지만 그것은 IDomainEvent에서 파생 된 100 개가 넘는 인터페이스를 가지고 있기 때문에 완전히 비현실적입니다. 말할 것도없이 나는 짐을 꾸려야 각자 개별적으로 모의해야한다. 아무도 내가 뭘 잘못 본거야?

답변

1

발생하는 문제는 Publish<T>()이라고하는 IDomainEvent의 모든 파생어가 다른 서명이있는 메소드로 구현된다는 것입니다.

MOQ은 당신이, mock.Setup(h => h.Publish(It.IsAny<IDomainEvent>));는 조롱 것 사실 Setup()

를 사용할 때 하나의 서명을 조롱 X는 특히 유형 IDomainEvent으로 컴파일러에 의해 처리 Publish<IDomainEvent>(x). 예 :

OrderPlaced event = new OrderPlaced(); 
mock.Object.Publish((IDomainEvent)event); 

모의 일반 방법의 모든 서명을 설정하는 방법은 없습니다. 리플렉션을 사용하여 런타임에 IDomainEvent에서 파생 된 모든 유형을 반복 할 수 없습니다. 일반적인 It.IsAny() 메소드에 액세스하려고하면 똑같은 문제가 발생하기 때문입니다.

자세한 내용은 this related answer을 다른 질문으로 읽으십시오. 당신의 모의 행동이 느슨한 경우

...

, 다음 방법에 관계없이 성공합니다. 그래서 당신이 .Returns() 또는 .Callback() 같은 추가 동작을 첨부하려는 가정합니다. 아마도 원하는 결과에 대해 더 자세히 살펴보면 대체 솔루션을 찾을 수있을 것입니다.

+0

제네릭에 대한 나의 이해가 완벽하지 않습니다. 제가 점수를 뺀다면 제 대답을 개선하도록 도와주세요. – perfectionist

+0

예 .Callback()을 사용하여 특정 IDomainEvent가 Published()인지 확인하는 테스트 용 목록에 IDomainEvent를 추가 할 수 있습니다. – Brian

+0

좋아, 우리는 아마도 수동으로 완전히 수동 mocking 클래스를 만들거나 Moq Mock을 포장하여 특정 문제를 해결할 수 있습니다. <> ... IDomainEvents의 목록을 대조하고 검사하고 있습니다 ** 모두 ** 수행하고 싶습니다. ? (나는 작업 후 몇 시간 만에 다시 돌아올 것이다.) – perfectionist

관련 문제