I have a method that I want to test which expects an IEnumerable<T> as a parameter.
I'm currently mocking the contents of the IEnumerable<T> as follows (Using Moq):
var mockParent = new Mock<ICsvTreeGridExportable>();
var mockChild = new Mock<ICsvTreeGridExportable>();
How do it put these mocked objects inside an IEnumerable<T> so that I can pass them as a parameter to the method I want to test?
The method I'm testing expects to receive an IEnumerable<ICsvTreeGridExportable>
I would just create an array using the collection intialiser syntax. i.e.
var mockParent = new Mock<ICsvTreeGridExportable>();
var mockChild = new Mock<ICsvTreeGridExportable>();
TestMethod(new[] { mockParent.Object, mockChild.Object });
Arrays in .NET implement the IEnumerable<T> interface, so you're all set.
Note: If you want a "pure" IEnumerable<T> (as Luke points out), you could use a little bit of LINQ to do that:
TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));
You could just create an array. (Arrays implement the IEnumerable<T> interface.)
var mockEnumerable = new[] { mockParent.Object, mockChild.Object };
If you want a "pure" IEnumerable<T> that can't be cast back to an array etc, then you could create it using a helper method:
var mockEnumerable = CreateEnumerable(mockParent.Object, mockChild.Object);
// ...
public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
foreach (T item in items)
{
yield return item;
}
}
(As Jamie mentions in the comments, you need to use the mocked objects, not the Mock objects. For example, mockParent.Object, mockChild.Object etc, not just mockParent or mockChild.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With