I am learning Test Driven Development and trying to use Moq library for mocking. What is the purpose of Setup method of Mock class?
Setup method is used to set expectations on the mock object For example:
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
Here you are setting the DoSomething
method on mock object. You are saying, when the parameter is "ping", the method returns true.
Now this object can further act as a mock or a stub depending on your usage. If you want to use it in state based testing, it can act as a stub. If you want to use it in behavior based testing, it can act as a mock. In behavior testing, you will call the verify method on the mock object to assert that the method was called with "ping" parameter
Further refer these links:
The default behaviour of a Moq Mock
object is to stub all methods and properties. This means that a call to that method/property with any parameters will not fail and will return a default value for the particular return type.
You call Setup
method for any or all of the following reasons:
- You want to restrict the input values to the method.
public interface ICalculator {
int Sum(int val1, val2);
}
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
It.IsAny<int>(), //Any value
3 //value of 3
));
The above setup will match a call to method Sum
with any value for val1
and val2
value of 3.
- You want to return a specific value. Continuing with
ICalculator
example, the following setup will return a value of 10 regardless of the input parameters:
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
It.IsAny<int>(), //Any value
It.IsAny<int>() //Any value
)).Returns(10);
- You want to use
Mock<T>.VerifyAll()
after you setups to verify that all previous setups have been called (once).
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
7, //Any value
3 //value of 3
));
mock.Setup(m=>m.Sum(
5, //Any value
3 //value of 3
));
mock.VerifyAll();
The above code verifies that Sum
is called twice. Once with (7,3)
and once with (5,3)
.