使用 FluentAssertions 和 NSubstitute 的异步单元测试是不确定的

Posted

技术标签:

【中文标题】使用 FluentAssertions 和 NSubstitute 的异步单元测试是不确定的【英文标题】:Unit Test with Async is Inconclusive with FluentAssertions and NSubstitute 【发布时间】:2016-09-15 11:59:22 【问题描述】:

我正在测试这个工厂

    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();
        
    

当我运行测试时,thes 没有运行,或者返回“不确定”结果。

如何使用 NSubstitute 和 FluentAssertions 测试异步调用?

2016 年 5 月 19 日更新

我修复了测试方法以返回 Task 而不是 void 并且测试抛出 NullReferenceExceptions

【问题讨论】:

首先要修复 - 更改您的测试方法以返回 Task,而不是 void。这可能不是您需要做的全部,但您当然应该这样做。 谢谢 =] id 工作。它使我的异步测试运行。现在,我遇到了 NullReferenceObject 异常。 您应该使用更新的信息更新您的问题或删除您的问题 我没有看到 Fluent Assertions 的任何用法。 【参考方案1】:

我只是复制/粘贴了您的代码,并为缺少的类型添加了几个空接口和类。开箱即用的测试运行良好。

至于您的问题“如何使用 NSubstitute 和 FluentAssertions 测试异步调用?”,这里是如何检查异步方法中的异常。

Func<Task> action = async () => await _contratoFactory.Build(contrato);
action.ShouldThrow<SomeValidationFailedException>();

【讨论】:

以上是关于使用 FluentAssertions 和 NSubstitute 的异步单元测试是不确定的的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluentassertions 和 Nunit 在单元测试中进行计数验证

FluentAssertions Throw() 未列出使用

如何在 FluentAssertions 中使用 Excluding 来排除 Dictionary 中的特定 KeyValue 对

使用 FluentAssertions API 4.x 语法迁移 xunit 项目以使用 FluentAssertions v5.x 版本运行

如何使用 FluentAssertions 检查对象是不是从另一个类继承?

如何使用 FluentAssertions 测试嵌套集合