Отправка электронной почты с помощью SendMailAsync из Nunit

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

Когда я делаю простое smtp.Send(mail);, работает ли оно хорошо?

// Nunit test
{
    [TestFixture]
    public class Tester
    {

        [Test]
        public void TestSendTestMail()
        {
            // Arrange

            // Act
            await EbayProxy.Instance.SendTestMail();

            // Assert
        }
    }

    public async Task SendTestMail()
    {
        MailMessage mail = new MailMessage();
        mail.From = new MailAddress(_mailFrom);
        mail.To.Add(_mailTo);

        mail.Subject = "Test Mail Subject Async";

        mail.Body = "Test Mail Body";

        mail.IsBodyHtml = true;

        SmtpClient smtp = new SmtpClient(_smtpClient, Convert.ToInt32(_smtpPort));
        smtp.EnableSsl = true;
        smtp.Credentials = new NetworkCredential(_mailFrom, _mailFromPassword);

        await smtp.SendMailAsync(mail); // Not sending mail :(
    }

person user829174    schedule 01.06.2016    source источник
comment
Начните читать... blog.stephencleary.com/2012/02/async -and-await.html   -  person Mick    schedule 01.06.2016


Ответы (2)


Как уже много раз объяснялось...

Как вызвать асинхронный метод из синхронного метода в C#?< /а>

Синхронный вызов асинхронного метода

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Я думаю, вы обнаружите, что этот код вызывает тупиковую блокировку. Пытаться...

[TestFixture]
public class Tester
{

    [Test]
    public async Task TestSendTestMail()
    {
        // Arrange

        // Act
        await EbayProxy.Instance.SendTestMail();

        // Assert
    }
}

public async Task SendTestMail()
{
    MailMessage mail = new MailMessage();
    mail.From = new MailAddress(_mailFrom);
    mail.To.Add(_mailTo);

    mail.Subject = "Test Mail Subject Async";

    mail.Body = "Test Mail Body";

    mail.IsBodyHtml = true;

    SmtpClient smtp = new SmtpClient(_smtpClient, Convert.ToInt32(_smtpPort));
    smtp.EnableSsl = true;
    smtp.Credentials = new NetworkCredential(_mailFrom, _mailFromPassword);

    await smtp.SendMailAsync(mail); // Not sending mail :(
}

Как обсуждалось здесь...

Как проверить асинхронный метод с NUnit, в конечном итоге с другим фреймворком?

person Mick    schedule 01.06.2016

На самом деле, прежде чем вы узнаете об Async/Await (это отличная тема!), я бы спросил, чего вы пытаетесь достичь, и точка.

Почему вы хотите протестировать само средство электронной почты, вы должны дать почтовому клиенту некоторый элемент доверия, но, кроме того, поскольку почта не гарантируется, вы можете только надеяться, что почта прибудет в пункт назначения. Фактическое подтверждение будет включать получателя.

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

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

person brumScouse    schedule 01.06.2016
comment
Итак, год спустя, глядя на вопрос, вы просто запускаете тест, чтобы убедиться, что он работает, на самом деле это не будет частью вашего набора тестов. Это должно быть так. - person brumScouse; 26.10.2017