Search code examples
c#moqxunitautofixture

AutoFixture.Freeze IEnumerable of Mocks


I'm very comfortable using AutoFixture.Freeze<Mock<IViolationChecker>>() to setup a class for testing with .Verify() and .Setup().

However, in the class I'm working on takes an enumerable of IViolationChecker

private readonly IEnumerable<IViolationChecker> _violationCheckers;

How can I use AutoFixture.Freeze to define my list of IViolationChecker? I've used

var violationCheckers = AutoFixture.Freeze<Mock<IEnumerable<IViolationChecker>>>();

But I'm not sure how I would write the .Verify() or .Setup().


Solution

  • An option would be to freeze the collection and use Mock.Get for each item to get the mocks for setup and verification.

    //Arrange
    var violationCheckers = AutoFixture.Freeze<IEnumerable<IViolationChecker>>();
    var mocks = violationCheckers.Select(item => Mock.Get(item));
    foreach (var mock in mocks) {
        mock.Setup(_ => _.SomethingHere()).Verifiable(); //setup mock as desired.
    }
    
    //...
    
    //Act
    //...exercise member under test
    
    //Assert
    foreach(var mock in mocks) {
        mock.Verify(_ => /* some predicate*/, Times.Once);
        //OR
        //mock.Verify();
    }
    
    //...