Moq Шпаргалка

Скачать

Moq Шпаргалка

1. Создать mock

var mock = new Mock<IMyService>();

2. Передать mock в код

var service = new MyClass(mock.Object);

3. Проверить, что метод вызвался 1 раз

mock.Verify(x => x.DoWork(), Times.Once);

4. Проверить, что метод не вызывался

mock.Verify(x => x.DoWork(), Times.Never);

5. Проверить вызов с любым аргументом

mock.Verify(x => x.Send(It.IsAny<string>()), Times.Once);

6. Проверить вызов с конкретным аргументом

mock.Verify(x => x.Send("hello"), Times.Once);

7. Проверить вызов с условием на аргумент

mock.Verify(x => x.Send(It.Is<string>(s => s.StartsWith("he"))), Times.Once);

8. Настроить возврат значения

mock.Setup(x => x.GetNumber()).Returns(42);

9. Настроить возврат по аргументу

mock.Setup(x => x.Exists(It.IsAny<int>())).Returns(true);

10. Настроить выброс исключения

mock.Setup(x => x.Send(It.IsAny<string>()))
    .Throws(new InvalidOperationException());

11. Асинхронный возврат

mock.Setup(x => x.GetByIdAsync(It.IsAny<int>()))
    .ReturnsAsync(item);

12. Асинхронное исключение

mock.Setup(x => x.GetByIdAsync(It.IsAny<int>()))
    .ThrowsAsync(new Exception("fail"));

13. Частые Times

Times.Once
Times.Never
Times.Exactly(2)
Times.AtLeastOnce()

14. Базовый шаблон теста

[Fact]
public void Test()
{
    // Arrange
    var mock = new Mock<IMyDependency>();
    var service = new MyService(mock.Object);

    // Act
    service.DoSomething();

    // Assert
    mock.Verify(x => x.SomeMethod(), Times.Once);
}

15. Пример для ITaskNotifier

[Fact]
public void Create_CallsNotifier()
{
    var notifierMock = new Mock<ITaskNotifier>();
    var service = new TaskService(notifierMock.Object);

    var request = new CreateTaskRequest
    {
        Title = "Task",
        AssigneeEmail = "user@example.com"
    };

    service.Create(request);

    notifierMock.Verify(
        x => x.NotifyAssigned(It.IsAny<TaskItem>()),
        Times.Once);
}

16. Проверка аргумента у NotifyAssigned

notifierMock.Verify(
    x => x.NotifyAssigned(It.Is<TaskItem>(t =>
        t.Title == "Task" &&
        t.AssigneeEmail == "user@example.com")),
    Times.Once);

17. Проверка, что вызова не было

Assert.Throws<ArgumentException>(() => service.Create(request));

notifierMock.Verify(
    x => x.NotifyAssigned(It.IsAny<TaskItem>()),
    Times.Never);

18. Что помнить
- Setup = как mock себя ведёт
- Verify = как его использовали
- Object = поддельная реализация интерфейса
- It.IsAny<T>() = любой аргумент
- It.Is<T>(...) = аргумент по условию