>source

제약이 있는 일반 메서드를 조롱하려고 합니다.T : IFoo

그러나 moq는 변환을 이해하지 못하고 다음 오류를 제공합니다.

유형 'Moq.It.IsSubtype' 제네릭 형식 또는 메서드에서 형식 매개 변수 'T'로 사용할 수 없습니다. 'IMyClass.DoSomething(액션)'. 암시적 참조가 없습니다. 변환 'Moq.It.IsSubtype< SomeNamepace.IFoo>' 에게 '썸네임페이스.아이푸'.

public interface IFoo
    {
    }
    class Foo : IFoo
    {
    }
    public interface IMyClass
    {
        public IDisposable DoSomething(Action asd) where T : IFoo;
    }
    public class MyTest
    {
        [Test]
        public void SomeTest()
        {
            var mock= new Mock();
            mock.Setup(e=> e.DoSomething(It.IsAny>())).Returns(Mock.Of());
//Action would work, but in real code its not used like that
            Action myAction= (e)=> { };
            var result= mock.Object.DoSomething(myAction);
            result.Dispose(); //Null reference exception
        }
    }

그들의 문서에서 유효한 것 같습니다: github.com/Moq/moq4/wiki/Quickstart#type-matchers-moq-413

Red Riding Hood2021-11-03 05:39:10

@madreflection 맞습니다. 하지만 이 경우 중첩된 제네릭 형식 IsSubtype은 IFoo를 구현하지 않을 것입니다.

canton72021-11-03 05:39:10

여기서 정확히 무엇을 테스트하려고 합니까? 분명히 전달된 제네릭은 IFoo의 하위 유형이 될 것입니다. 그렇지 않으면 컴파일되지 않습니까?

Liam2021-11-03 05:39:10

@canton7: ​​아니요, 맞습니다. 그렇지 않습니다. Moq의 자체 ITypeMatcher만 구현합니다. 나는 그것이 구문 오류가 아니라는 점을 지적했을 뿐입니다(적어도 당신이 생각한 방식은 아님). 문서에는 그것이 당신이해야 할 일이라고 나와 있습니다. 제한된 제네릭 형식 매개 변수를 처리할 때 라이브러리의 제한 사항일 수 있습니다.

madreflection2021-11-03 05:39:10

내 실제 code의 @Liam DoSomething은 IDisposable을 반환하므로 Mock을 반환하기를 원하지만 최소 예제에서는 제거했습니다. 그렇지 않으면 null 예외가 발생합니다.

Red Riding Hood2021-11-03 05:39:10
  • 이전 panel : foreach를 사용하는 대신 패널 컨트롤에서 그림 상자의 위치를 ​​지정하는 방법은 무엇입니까?(윈도우 신청서)
  • 다음 Phantom 지갑을 Flutter 웹 앱에 어떻게 연결하나요?