DEV Community

Kenichiro Nakamura
Kenichiro Nakamura

Posted on

Moq: How to specify the argument with detail condition when mock a method?

This is my own note to remember how we can pass argument to mocked method in various ways.

Method to mock

I mock following service as an example, though this does nothing anyway.

public class DummyService
{
    public virtual string DummyMethod(string input)
    {
        return input;
    }
}
Enter fullscreen mode Exit fullscreen mode

Mock method with any value

We can use It.IsAny<T> to mock the method which accepts any value of T.

[Fact]
public void Test()
{
    Mock<DummyService> mockedDummyService = new();
    mockedDummyService.Setup(x => 
        x.DummyMethod(It.IsAny<string>())).Returns("dummy result");
}
Enter fullscreen mode Exit fullscreen mode

Mock method with specify value

We can pass actual value to mock the method which triggered only when the argument exactly matches.

[Fact]
public void Test()
{
    Mock<DummyService> mockedDummyService = new();
    mockedDummyService.Setup(x => 
        x.DummyMethod("testInput")).Returns("dummy result");
}
Enter fullscreen mode Exit fullscreen mode

Mock method with more detail condition

Or, we can specify more detail condition by using It.Is<T>(Func<T, bool>). The method will be triggered when I pass string such as MyInput, MyValue, etc.

[Fact]
public void Test()
{
    Mock<DummyService> mockedDummyService = new();
    mockedDummyService.Setup(x => 
        x.DummyMethod(It.Is<string>(x=>x.StartsWith("My")))).Returns("dummy result");
}
Enter fullscreen mode Exit fullscreen mode

And more

Moq.It has way more methods to control input patterns.

Image description

Top comments (0)