Как проверить, что метод был вызван при макете, когда сам метод вызывается в делетете, переданном Task.Run
? По времени mock.Verify
называется Task еще не выполнен.Проверка метода Mock вызывалась внутри Task.Run
Я пробовал await Task.Delay
как раз перед mock.Verify
, но это, похоже, покидает тестовый бегун.
Причина использования Task.Run
заключается в том, чтобы разгрузить логику, чтобы злоумышленник не мог отличить, существует ли электронный адрес в системе к моменту его выполнения.
using System.Threading.Tasks;
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
namespace AsyncTesting
{
class MyController : Controller
{
public IEmailService EmailService { get; set; }
public MyController(IEmailService emailService)
{
EmailService = emailService;
}
public ViewResult BeginPasswordReset(string emailAddress)
{
BeginPasswordResetAsync(emailAddress);
return View();
}
private Task BeginPasswordResetAsync(string emailAddress)
{
return Task.Run(delegate
{
EmailService.Send(emailAddress);
});
}
}
internal interface IEmailService
{
void Send(string emailAddress);
}
internal class MyControllerTests
{
[TestMethod]
public void BeginPasswordReset_SendsEmail()
{
var mockEmailService = new Mock<IEmailService>();
var controller = new MyController(mockEmailService.Object);
const string emailAddress = "[email protected]";
controller.BeginPasswordReset(emailAddress);
mockEmailService.Verify(es=>es.Send(emailAddress));
}
}
}
Я не уверен в MSTest, но с NUnit вы можете использовать метод асинхронного тестирования и ждать метода BeginPasswordResetAsync. Задача завершится после ожидания. Изучите асинхронные тесты с помощью MSTest. – Padraic
'Причина использования Task.Run ...' Извините, но это плохая причина для того, чтобы ввести такой пункт ошибки в ваше приложение. 'Task.Run' чрезвычайно опасен для ASP.NET; по крайней мере, используйте 'HostingEnvironment.QueueBackgroundWorkItem'. –
Спасибо @ StephenCleary, я прочитаю ваши комментарии по теме http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html –