Using Moq to Mock a Func<> constructor parameter and Verify it was called twice

前端 未结 3 588
萌比男神i
萌比男神i 2021-01-03 18:59

Taken the question from this article (How to moq a Func) and adapted it as the answer is not correct.

public class FooBar
{
    private Func

        
相关标签:
3条回答
  • 2021-01-03 19:15

    I don't think it is necessary to use a mock for the Func.

    You can simply create an ordinary Func yourself that returns a mock of IFooBarProxy:

    int numberOfCalls = 0;
    Func<IFooBarProxy> func = () => { ++numberOfCalls;
                                      return new Mock<IFooBarProxy>(); };
    
    var sut = new FooBar(func);
    
    sut.Process();
    
    Assert.Equal(2, numberOfCalls);
    
    0 讨论(0)
  • 2021-01-03 19:20

    Since Moq v4.1.1308.2120

    As of this version, which was released some months after this question was asked (Aug 21, 2013), the functionality to mock a Func<> has been added. So with any current version of mock, you can use var funcMock = new Mock<Func<IFooBarProxy>>();.

    Original (outdated) answer

    If you have a lot of callback Func's, Actions, etc, it's better to define a helper interface in your tests and mock that interface. This way you can use the regular Moq functionality, like setting up return values, testing input arguments, etc.

    interface IFooBarTestMethods
    {
        IFooBarProxy FooBarProxyFactory();
    }
    

    Usage

    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));
    
    0 讨论(0)
  • 2021-01-03 19:29

    As of at least Moq 4.5.28, you can mock and verify the Func as you would expect to be able to. I couldn't tell when this feature was added (according to the original question at some point this did not work).

    [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));
    }
    
    0 讨论(0)
提交回复
热议问题