Как бы это было полезно - PullRequest
2 голосов
/ 26 августа 2011

Я все еще изучаю, как, когда и где издевается носорог.Я только что закончил просмотр этого урока: http://dimecasts.net/Content/WatchEpisode/12, Я даже набрал его, используя синтаксис 3,5+ AAA из записи / воспроизведения, но у меня вопрос: насколько это полезно, что вы можете сделать с этим.Я принципиально что-то упускаю.

public class EmailerService
{
    public bool SendEmail(string email, string message)
    {
        return false;
    }
}

public class Emailer
{
    private IEmailerService _emailerService;
    public Emailer(IEmailerService emailerService)
    {
        this._emailerService = emailerService;
    }

    public void SendBatchEmails()
    {
        var emails = new Dictionary<string, string>
                        {
                            {"fred1@foo.com", "Hello1"},
                            {"fred2@foo.com", "Hello2"},
                            {"fred3@foo.com", "Hello3"},
                            {"fred4@foo.com", "Hello4"}
                        };
        foreach(KeyValuePair<string, string> email in emails)
        {
            if(!_emailerService.SendEmail(email.Key, email.Value))
            {
                throw new Exception(" You've Err'd");
            }
        }
    }
}

Мой тест выглядит следующим образом:

        [TestMethod]
    public void EmailerServiceTest()
    {
        //Arrange
        var emailerServie = MockRepository.GenerateMock<IEmailerService>();
        emailerServie.Expect(x => x.SendEmail("", "")).IgnoreArguments().Return(true).Repeat.Any();

        //Act
        var emailer = new Emailer(emailerServie);
        emailer.SendBatchEmails();
    }


    [TestMethod]
    public void EmailerServiceTestException()
    {
        //Arrange
        var emailerServie = MockRepository.GenerateMock<IEmailerService>();
        emailerServie.Expect(x => x.SendEmail("", "")).IgnoreArguments().Throw(new Exception("You've Err'd"));

        //Act
        var emailer = new Emailer(emailerServie);
        emailer.SendBatchEmails();
    }

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

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Что-то не так.

Я думаю, вы хотите проверить

  • когда вызывается emailer.SendBatchEmails .. он делегирует emailerService.SendEmail.
  • когда вызывается emailer.SendBatchEmails и emailerService возвращает ошибку (возвращая false), тогда должно выдаваться исключение.

В первом тесте вы должны убедиться, что emailerService.SendEmail действительно был вызван (отсутствует) Во-вторых, макет должен быть настроен на возврат false. Метод теста должен быть настроен так, чтобы ожидать исключения с конкретным сообщением об ошибке.

2 голосов
/ 26 августа 2011

Ваши тесты до сих пор выглядят так, как будто вы на правильном пути.Если ваши тесты кажутся очевидными, это хорошо.Они там, чтобы обеспечить ожидаемое поведение.Если через несколько месяцев вы забыли о Emailer, но изменили EmailerService, чтобы выдать исключение при ошибке, вместо возврата false, ваши тесты напомнят вам, что Emailer ожидает другое поведение и нуждается в обновлении.

При написании модульных тестов я всегда делаю две вещи перед любой реализацией: 1) пишу четкое имя функции теста и делю метод на три компонента Arrange, Act, Assert .Это помогает мне сохранять ясность своих ожиданий от теста и гарантировать, что я ничего не забываю.

Кажется, что вы забыли включить часть теста Assert :

[TestMethod]
public void Emailer_IsCalled_SendEmailIsCalled()
{
    //Arrange
    var emailerService = MockRepository.GenerateMock<IEmailerService>();
    emailerServie.Expect(x => x.SendEmail("", "")).IgnoreArguments().Return(true).Repeat.Any();

    //Act
    var emailer = new Emailer(emailerService);
    emailer.SendBatchEmails();

    //Assert
    emailer.VerifyAllExpectations();
}

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

[TestMethod, ExpectedException(typeof(Exception))]
public void Emailer_SendEmailReturnsFalse_ThrowException()
{
    //Arrange
    var emailerService = MockRepository.GenerateStub<IEmailerService>();
    emailerServie.Stub(x => x.SendEmail("", "")).IgnoreArguments().Return(false);

    //Act
    var emailer = new Emailer(emailerService);
    emailer.SendBatchEmails();

    //Assert
    //Expect Exception
    /* Even when I don't have and assert call here, I usually leave a note*/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...