2013-02-06 1 views
18

이 기사의 질문 (How to moq a Func)을 사용하고 대답이 잘못되어 적용되었습니다.Moq를 사용하여 Func <> 생성자 매개 변수를 모의하고 두 번 호출되었는지 확인하십시오.

public class FooBar 
{ 
    private Func<IFooBarProxy> __fooBarProxyFactory; 

    public FooBar(Func<IFooBarProxy> fooBarProxyFactory) 
    { 
     _fooBarProxyFactory = fooBarProxyFactory; 
    } 

    public void Process() 
    { 
     _fooBarProxyFactory(); 
     _fooBarProxyFactory(); 
    } 
} 

나는 생성자 매개 변수로 전달되는 Func을 <>의 FUNC 통화 두 번이었다 어설 조롱 할 필요가있다.

함수를 모의하려고 할 때 var funcMock = new Mock<Func<IFooBarProxy>>(); Func 유형이 모의되지 않기 때문에 Moq가 발생하고 예외가 발생합니다.

func를 조롱하지 않으면 func이 (n) 번 호출되었는지 확인할 수 없다는 것이 문제입니다. funcMock.Verify((), Times.AtLeast(2));

+0

이제 Moq는 OP가 원래 시도한 작업을 지원합니다. @ ktam33의 대답을 참조하십시오. – Mike

답변

27

나는 Func을 모의 할 필요가 없다고 생각합니다.

당신은 단순히 IFooBarProxy의 모의 반환 자신 FUNC 일반을 만들 수 있습니다

:

int numberOfCalls = 0; 
Func<IFooBarProxy> func =() => { ++numberOfCalls; 
            return new Mock<IFooBarProxy>(); }; 

var sut = new FooBar(func); 

sut.Process(); 

Assert.Equal(2, numberOfCalls); 
2

는 MOQ v4.1.1308.2120

때문에 몇 달 출시 된 버전, 현재이 질문에 질문을 받았다 후를 (2013 년 8 월 21 일), 모의 기능이 Func<>has been added입니다. 따라서 모의 현재 버전에서는 var funcMock = new Mock<Func<IFooBarProxy>>();을 사용할 수 있습니다. 당신이 등 콜백 Func 년대, Actions, 많은 경우

원본 (오래된) 대답

, 그것은 당신의 검사 결과에 도우미 인터페이스를 정의하고 해당 인터페이스를 조롱하는 것이 좋습니다. 당신이 입력 인수 테스트, 반환 값을 설정처럼, 일반 MOQ 기능을 사용할 수있는이 방법 등

interface IFooBarTestMethods 
{ 
    IFooBarProxy FooBarProxyFactory(); 
} 

사용 적어도 MOQ 4.5.28, 당신이 할 수있는 현재로

var testMethodsMock = new Mock<IFooBarTestMethods>(); 
testMethodsMock 
    .Setup(x => x.FooBarProxyFactory()) 
    .Returns(new Mock<IFooBarProxy>()); 

var sut = new FooBar(testMethodsMock.Object.FooBarProxyFactory); 
testMethodsMock.Verify(x => x.FooBarProxyFactory(), Times.Exactly(2)); 
6

조롱하고 당신이 할 수있을 것으로 기대했던대로 Func를 검증하십시오. 이 기능이 추가 된 시점을 알 수 없었습니다 (원래의 질문에 따라이 기능이 작동하지 않음).

[Test] 
public void TestFoobar() 
{ 
    var funcMock = new Mock<Func<IFooBarProxy>>(); 
    var fooBar = new FooBar(funcMock.Object); 
    fooBar.Process(); 
    funcMock.Verify(x => x(), Times.AtLeast(2)); 
}