Using Moq with Linq Any()
.net, c#, mocking, moq, unit-testing
Solution
You need to mock `Integers` property only. There is no need to mock `Any()` (you can't do it anyway because it's an extension method) because it is a part of SUT. Here's how you should do it for two cases:
[TestMethod]
public void NoIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
mockBar.SetupGet(x => x.Integers)
.Returns(new List<int>());
Assert.IsFalse(new Foo(mockBar.Object).AreThereIntegers());
}
[TestMethod]
public void HasIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
mockBar.SetupGet(x => x.Integers)
.Returns(new List<int>{ 3, 5, 6});
Assert.IsTrue(new Foo(mockBar.Object).AreThereIntegers());
}
Problem
I have a setup similar to below: ``` [TestMethod] public void NoIntegers() { Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict); Mock<IEnumerable<int>> mockIntegers = new Mock<IEnumerable<int>>(MockBehavior.Strict); mockBar .SetupGet(x => x.Integers) .Returns(mockIntegers.Object); mockIntegers .Setup(x => x.Any()) .Returns(false); Assert.IsFalse(new Foo(mockBar.Object).AreThereIntegers()); } public interface IBar { IEnumerable<int> Integers { get; } } public class Foo { private IBar _bar; public Foo(IBar bar) { _bar = bar; } public bool AreThereIntegers() { return _bar.Integers.Any(); } } } ``` When it runs it fails to initialise the mock ``` Test method NoIntegers threw exception: System.NotSupportedException: Expression references a method that does not belong to the mocked object: x => x.Any<Int32>() ``` I have tries adding `It.IsAny()` in a few forms: ``` mockIntegers .Setup(x => x.Any(It.IsAny<IEnumerable<int>>(), It.IsAny<Func<int, bool>>())) .Returns(false); // No method with this signiture mockIntegers .Setup(x => x.Any(It.IsAny<Func<int, bool>>())) .Returns(false); // Throws: Test method NoIntegers threw exception: // System.NotSupportedException: // Expression references a method that does not belong to the mocked object: // x => x.Any<Int32>(It.IsAny<Func`2>()) ``` What do I need to mock in order for this to run?