Модульный тест с Async не дает результатов с FluentAssertions и NSubstitute

Я тестирую эту фабрику

    public class ContratoFactory : IContratoFactory
    {
        private readonly IContratoPodeSerCriadoValidation _contratoPodeSerCriadoValidation;

        public ContratoFactory(IContratoPodeSerCriadoValidation contratoPodeSerCriadoValidation)
        {
            _contratoPodeSerCriadoValidation = contratoPodeSerCriadoValidation;
        }

        public async Task<IValidationResult> Build(Contrato entity)
        {
            try
            {
                var result = _contratoPodeSerCriadoValidation.Valid(entity);
            }
            catch (Exception ex)
            {

                // throw 
            }
        }

        public async Task AdicionarLocalBase(Contrato entity)
        {
        }
    }

а вот мой тестовый класс

    [TestClass]
    public class ContratoFactoryTests
    {
        private IContratoPodeSerCriadoValidation _contratoPodeSerCriadoValidation;
        private ContratoFactory _contratoFactory;

        [TestInitialize]
        public void Initialize()
        {
            _contratoPodeSerCriadoValidation = Substitute.For<IContratoPodeSerCriadoValidation>();
            _contratoFactory = new ContratoFactory(_contratoPodeSerCriadoValidation);
        }

        [TestMethod]
        public async Task AoSerCriadoOContratoDeveSerValidado()
        {
            var contrato = ContratoValues.ContratoComEmpresaENomeValido;
            await _contratoFactory.Build(contrato);
            _contratoPodeSerCriadoValidation.Valid(contrato).Received();
        }
    }

Когда я запускаю свои тесты, те не запускаются или возвращают «неубедительный» результат.

Как протестировать асинхронные вызовы с помощью NSubstitute и FluentAssertions?

ОБНОВЛЕНИЕ 19.05.16

Я исправил тестовые методы, чтобы они возвращали Task вместо void, и тесты выдают NullReferenceExceptions.


person Jedi31    schedule 18.05.2016    source источник
comment
Первое, что нужно исправить — измените метод тестирования, чтобы он возвращал Task, а не void. Возможно, это не все, что вам нужно сделать, но вы обязательно должны это сделать.   -  person Jon Skeet    schedule 18.05.2016
comment
Спасибо =] id работает. И это заставляет мои асинхронные тесты работать. Теперь у меня есть исключение NullReferenceObject.   -  person Jedi31    schedule 18.05.2016
comment
Вы должны обновить свой вопрос с обновленной информацией или удалить свой вопрос   -  person Scott Chamberlain    schedule 19.05.2016
comment
Я не вижу никакого использования Fluent Assertions.   -  person Dennis Doomen    schedule 23.05.2016


Ответы (1)


Я просто скопировал/вставил ваш код и добавил пару пустых интерфейсов и классов для отсутствующих типов. Тесты прошли нормально из коробки.

Что касается вашего вопроса «Как я могу протестировать асинхронные вызовы с помощью NSubstitute и FluentAssertions?», вот как проверить исключения из асинхронного метода.

Func<Task> action = async () => await _contratoFactory.Build(contrato);
action.ShouldThrow<SomeValidationFailedException>();
person Jørn Jensen    schedule 14.07.2016