Update
If All()
is not an extension method then update the mock setup to return a queriable when called.
this._myMockRepository
.Setup(_ => _.All())
.Returns(this.GetFakeMyObjects());//<-- assuming GetFakeMyObjects returns an enumerable
This assumes a repository defined something like
public interface IRepository {
IEnumerable<MyObject> All();
}
or close to that definition.
Original Answer
Those are all extension methods. Moq does not mock extension methods.
What you need to mock is what it returned when the mocked members are called that can satisfy the provided linq queries.
The assumption based on the code snippet suggests that the subject of the mock is enumerable.
The following extension method can be used to mock the behavior needed to perform queries on an enumerable mock.
/// <summary>
/// Converts a generic <seealso cref="System.Collections.Generic.IEnumerable<T>"/> to a <see cref="Moq.Mock"/> implementation of queryable list
/// </summary>
public static Mock<T> SetupQueryable<T, TItem>(this Mock<T> queryableMock, IEnumerable<TItem> source)
where T : class, IEnumerable<TItem> {
var queryableList = source.AsQueryable();
queryableMock.As<IQueryable<TItem>>().Setup(x => x.Provider).Returns(queryableList.Provider);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.Expression).Returns(queryableList.Expression);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());
return queryableMock;
}
and can be used like this.
var fakeItems = GetFakeMyObjects();
var _myMockRepository = new Mock<IMyRepository>()
_myMockRepository.SetupQueryable(fakeItems);
This would now allow queries to be called on the mocked object when testing.
var myRepository = _myMockRepository.Object;
var myRecord = myRepository.All().Any(e => e.Id == id);