Это методы моего бизнес-движка. Загрузить звонит внутренне метод асинхронной UploadAsync()Подождите, пока не будет выполнен асинхронный метод void в блоке тестирования
public void Upload(Stream data)
{
//Some logic
//Call private async method
UploadAsync(data);
}
private async void UploadAsync(Object data)
{
await Task.Run(() =>
{
using (var factory = new DataRepositoryFactoryObject<IAllCommandRepository>(DataRepositoryFactory))
{
factory.Repository.UploadData(data);
}
}
);
}
Это устройство тест для загрузки() метод
[TestMethod, TestCategory("Unit")]
public void Upload_ValidData_Success()
{
//other logic to setup mock repository
//call public method which calls async method
engine.Upload(data);
_mockAllCommandRepository.Verify(x => x.Upload(It.Is<Object>(t => t != null)), Times.Once);
}
Этот тест становится не удалось occasioally на проверить метод с исключением следующего:
016-10-06T19:25:20.4982657Z ##[error]Expected invocation on the mock once, but was 0 times: x => x.Upload(It.Is<Object>(t => t != null)), Times.Once);
Согласно моему методу проверки проверки вызывается перед вызовом метода async. Это может быть причиной отказа этого теста. Как я могу проверить, вызван ли метод при макете, когда сам метод вызывается в делегате, переданном в Task.Run? К моменту времени mock.Verify называется Task еще не выполнил. Может ли кто-нибудь предложить какое-то решение, чтобы этот тестовый пример прошел каждый раз
Какая версия Visual Studio (издание)? – zaitsman
В большинстве случаев огонь и забывание - плохая идея. Можете ли вы выполнить асинхронную задачу «Загрузить»? – qxg
Вы не можете ждать метода async void. * Не используйте 'async void', особенно в этом случае. Это предназначено только для обработчиков событий или подобных функций. Здесь не так. Есть даже предупреждения Resharper и Roslyn о некорректном использовании 'async void' –