Kyle Trauberman
Kyle Trauberman

Reputation: 25684

Mock one method on a class instead of the whole class using Moq?

I have a class

public interface IMyInterface 
{
    string MethodA();
    void MethodB();
}

public class MyClass : IMyInterface
{
    public string MethodA()
    {
        // Do something important
    }

    public void MethodB()
    {
        string value = MethodA();
        // Do something important
    }
}

I want to unit test MethodB, but I'm having trouble thinking about how I can Mock MethodA while still calling into MethodB using Moq. Moq mocks the interface, not the class, so I can't just call mock.Object.MethodB(), right?

Is this possible? If so, how?

Upvotes: 10

Views: 2302

Answers (2)

Adronius
Adronius

Reputation: 256

Mock dependencies you cannot instanciate easily (or all).
MyClass is class under test, so should not be mocked (you don't want to test mocked values).
But, if you have some MyClass.Foo property that is class Foo which implements IFoo interface and MethodA uses this Foo property, then you can mock it to break dependency.

Upvotes: 1

Alexei Levenkov
Alexei Levenkov

Reputation: 100547

I don't think it is possible. Even it is possible I'd prefer not to do that.

You are testing behavior of MyClass, the fact that it happen to implement IMyInterface is somewhat unrelated to testing behavior of MethodA and MethodB. You can have separate test that makes sure that class implements interfaces that you expect it to implement if necessary. Testing of MyClass.MethodB should be done on instance of MyClass, not on semi-mocked object.

If you think that behavior of MethodA is dependency you may try actually extract it explicitly from the class. It will allow to test both MethodA (which will simply delegate to the dependency) and MethodB (which will use the dependency and do more).

Upvotes: 4

Related Questions