Expression references a method that does not belong to the mocked object

This problem occurs because you are trying to mock Select method, which is an extension method, not an instance method of IEnumerable<T>.

Basically, there is no way to mock an extension method. Have a look at this question for some ideas that you may find useful.

UPD (12/11/2014):

To gain more understanding on mocking extension methods, think about the following:

  • Although extension methods are called as if they were instance methods on the extended type, they are actually just a static methods with a bit of syntactic sugar.

  • Extension methods from System.Linq namespace are implemented as pure functions — they are deterministic and they don’t have any observable side effects. I agree that static methods are evil, except those that are pure functions — hope you would agree with this statement too 🙂

  • So, given an object of type T, how would you implement static pure function f(T obj)? It is only possible by combining other pure functions that are defined for object T (or any other pure functions, actually), or by reading immutable and deterministic global state (to keep function f deterministic and side-effect-free). Actually, “immutable and deterministic global state” has more convenient name — a constant.

So, it turns out that if you follow the rule that static methods should be pure functions (and it looks like Microsoft follows this rule, at least for the LINQ methods), mocking an extension method f(this T obj) should be reducible to mocking non-static methods or state used by that extension method — simply because that extension method relies on the obj instance methods and state in its implementation (and possibly on the other pure functions and/or constant values).

In case of IEnumerable<T>, Select() extension method is implemented in terms of foreach statement which, in turn, uses GetEnumerator() method. So you can mock GetEnumerator() and achieve required behavior for extension methods that rely on it.

Leave a Comment

techhipbettruvabetnorabahisbahis forumu