Издевается, чтобы проверить взаимодействие - PullRequest
3 голосов
/ 30 июня 2011

Обычно, когда мне нужно макетировать класс для тестирования, я использую такую ​​библиотеку, как Rhino Mocks.Здесь у меня есть класс MyService, который ожидает IEmailSender.

public class MyService
{
    private readonly IEmailSender sender;

    public MyService(IEmailSender sender)
    {
        this.sender = sender;
    }

    public void Start()
    {
        this.sender.SendEmail();
    }
}

Если бы мне нужно было проверить взаимодействие между этими двумя объектами, мой тест выглядел бы примерно так:

[TestMethod]
public void Start_Test_Using_Rhino_Mocks()
{
    IEmailSender emailSender = MockRepository.GenerateMock<IEmailSender>();

    MyService service = new MyService(emailSender);
    service.Start();

    emailSender.AssertWasCalled
        (
            x => x.SendEmail(),
            c => c.Repeat.Once()
        );
}

В тесте выше я использую Rhino Mocks для генерации макета и утверждаю, что метод SendEmail() был вызван один раз.

Но что, если я не смог использовать Rhino Mocks и должен был создавать ручные макеты?

public class MockEmailSender : IEmailSender
{
    public void SendEmail()
    {
    }
}

[TestMethod]
public void Start_Test_Using_Manual_Mocks()
{
    MockEmailSender emailSender = new MockEmailSender();

    MyService service = new MyService(emailSender);
    service.Start();

    // How do I test the interaction?
}

С макетом, который я создал вручную, как я мог убедиться, что метод SendEmail() былназывается?Я мог бы поместить свои утверждения в метод макета SendEmail(), но это затруднило бы понимание теста, поскольку я не сразу вижу, что происходит, когда смотрю на тест.

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

В очень простом решении ваш ручной макет будет просто держателем состояния со счетчиками для вызовов каждого метода. Но это хрупко ...

public class MockEmailSender : IEmailSender
{
    public int SendCount = 0;

    public void SendMail(...)
    {
        SendCount++;
    }

    // ... other IEmailSender methods ...
}

Затем просто сделайте запрос SendCount после вызова вашего метода и убедитесь, что он == 1.

Помните, Rhino Mocks создает это динамически для вас - если вы делаете это вручную, вы должны вручную реагировать на изменения интерфейса до времени компиляции.

1 голос
/ 30 июня 2011

Я думаю, что у вас нет другого выбора, кроме установки флага в «SendEmail ()» и проверки этого флага из теста через новый метод MockEmailSender, например «sendMailWasInvoked ()» или что-то вроде это (что на самом деле является своего рода «проверить»). Вы можете расширить это, чтобы посчитать количество вызовов, параметры ...

0 голосов
/ 30 июня 2011

ну, я бы не советовал создавать какие-либо ручные макеты (потому что, если вы добавите новый метод в интерфейс, он сломается).

, если вам действительно нужно это сделать, когда выставите некоторый счетчик / bool в MockEmailSender, и вы сможете утверждать это позже.

Assert.IsTrue(emailSender.IsCalled)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...