Overview
Argument matchers can be used for configuring and verifying methods and properties.
Some test examples below use this system:
public class Service
{
private readonly IFoo _foo;
public Service(IFoo foo) => _foo = foo ?? throw new ArgumentNullException(nameof(foo));
public void Ping() => _foo.DoSomething("PING");
}
public interface IFoo
{
bool DoSomething(string command);
}
And are arranged like this:
var mock = new Mock<IFoo>();
var sut = new Service(mock.Object);
Configuring Method Calls with Matchers
It.Is<T>
for any instance of T
When DoSomething()
is called with any string argument, it should return true
:
mock.Setup(mock => mock.DoSomething(It.IsAny<string>())).Returns(true);
It.IsInRange
for any value in a range
When Add()
is called with any integer in the range [0, 10], it should return true
:
mock.Setup(mock => mock.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true);
It.Ref<T>.IsAny
for any value of a ref
parameter
When Submit()
is called with any ref
parameter of type Bar
, it should return true
:
mock.Setup(mock => mock.Submit(ref It.Ref<Bar>.IsAny)).Returns(true);
It.IsRegex
for any string that matches a regular expression pattern
When DoSomethingStringy()
is called with a string that matches regular expression pattern "[a-d]+"
, it should return "foo"
:
mock.Setup(x => x.GetUsername(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");
InSequence
for verifying the calling sequence
This specifies that DoWithInteger()
must be called, followed directly by DoWithDate()
. Use MockBehavior.Strict
to throw exceptions for non-configured calls:
var mockFirst = new Mock<IFirstService>(MockBehavior.Strict);
var mockSecond = new Mock<ISecondService>(MockBehavior.Strict);
var sequence = new MockSequence();
mockFirst.InSequence(sequence).Setup(p => p.DoWithInteger(1));
mockSecond.InSequence(sequence).Setup(p => p.DoWithDate(DateTime.Today));
A Delegate
When Add()
is called with a Func<int>
, it should return true
:
mock.Setup(mock => mock.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);