How to mock protected virtual members in FakeItEasy?
Asked Answered
R

2

14

Moq allows mocking protected virtual members (see here). Is it possible to do the same in FakeItEasy?

Richella answered 18/3, 2011 at 11:32 Comment(0)
D
37

It can be done, however it can not be done out of the box. The trick is to implement IFakeObjectCallRule and add it to your fake through Fake.GetFakeManager(foo).AddRule(myRule).

I'm thinking of implementing this feature though, it would be something like this:

A.CallTo(foo).WhereMethod(x => x.Name == "MyProtectedMethod").Returns("whatever");

The syntax is not quite refined yet though.

Edit The feature mentioned above is now implemented:

A.CallTo(foo).Where(x => x.Method.Name == "MyProtectedMethod").WithReturnType<int>().Returns(10);
Dulia answered 20/3, 2011 at 16:38 Comment(3)
Awesome. Thanks a lot for the new feature. Now I can remove my own rule again.Richella
I tried the code you provided above, but the method MyProtectedMethod is still being called. I would expect it to return the fake return value but not to call the original method. Am I doing something wrong?Drift
@Drift Perhaps the method isn't virtual?Richella
R
19

In addition to Patrik's answer, I thought it would be relevant in this post to add a tip of how you could mock a protected property member:

A.CallTo(foo).Where(x => x.Method.Name == "get_MyProtectedProperty").WithReturnType<int>().Returns(10);

This is actually how reflection treats 'getter' methods of properties.

Hope it helps :)

Rarely answered 1/9, 2012 at 11:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.