Странное исключение тестирования EmailSender - PullRequest
1 голос
/ 20 марта 2019

Я только что внимательно следовал всем инструкциям MS по созданию леса интерфейса Identity в приложении ASP.NET Core 3.0 MVC.Если я запускаю проект, он прекрасно открывает домашнюю страницу по умолчанию, и ссылки на этой странице хорошо реагируют.Тем не менее, простой интеграционный тест не выполняется с исключением.

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

public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
    using (var client = new SmtpClient())
    using (var msg = new MailMessage())
    {
        msg.From = new MailAddress("system@timekeeper.co.za");
        msg.To.Add(new MailAddress(email));
        msg.Subject = subject;
        msg.IsBodyHtml = true;

        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("timekeeper@somewhere.com", "something");
        client.Host = "mail.myhost.com";
        client.Port = 25;
        return client.SendMailAsync(msg);
    }
}

, а мой тест выглядит так:

[TestMethod]
public async Task Send_Email()
{
    var sender = new EmailSender();

    await sender.SendEmailAsync("somebody@somewhere.net", "Test Mail", "This is a test");

    Assert.IsTrue(true);
}

Когда я запускаю тест, он не проходит со следующим исключением:

Test method TimeKeeper.Tests.Integration.EmailSEnderTests.Send_Email threw exception: 
System.Threading.Tasks.TaskCanceledException: A task was canceled.
    at TimeKeeper.Tests.Integration.EmailSEnderTests.Send_Email() in D:\Dev\RestServices\TimeKeeper.Tests.Integration\EmailSEnderTests.cs:line 15
   at Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)

1 Ответ

0 голосов
/ 22 марта 2019

await задание вместо его возврата.

public async Task SendEmailAsync(string email, string subject, string htmlMessage) {
    using (var client = new SmtpClient())
    using (var msg = new MailMessage()) {
        msg.From = new MailAddress("system@timekeeper.co.za");
        msg.To.Add(new MailAddress(email));
        msg.Subject = subject;
        msg.IsBodyHtml = true;

        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("timekeeper@somewhere.com", "something");
        client.Host = "mail.myhost.com";
        client.Port = 25;
        await client.SendMailAsync(msg); //<-- await completion
    }
}

Скорее всего, client утилизируется до того, как у него появится возможность завершить отправку электронного письма.

Вы также должны принять к сведению предупреждения в документации об использовании сейчас. устарел SmtpClient для новой разработки.

DE0005: SmtpClient не должен использоваться

Мотивация

SmtpClient не поддерживает многие современные протоколы.Это только для общения.Он отлично подходит для рассылки электронных писем из инструментов, но не соответствует современным требованиям протокола.

Рекомендация

Используйте MailKit или другие библиотеки.

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