全局等效配置。排除成员

Posted

技术标签:

【中文标题】全局等效配置。排除成员【英文标题】:Global equivalency config. Excluding members 【发布时间】:2019-12-15 12:50:30 【问题描述】:

我想知道是否可以为测试进行全局配置。我知道我可以像这样比较这个对象:

x.Should().BeEquivalentTo(y, opt => opt.Excluding(z => z.Member)

但我希望我的测试中的所有方法都使用这个配置。

【问题讨论】:

【参考方案1】:

要从特定类型中排除成员,您可以创建自定义IMemberSelectionRule

要对所有测试使用该选择规则,请在单元测试框架的某些设置方法中使用静态 AssertionOptions.AssertEquivalencyUsing。 请注意,AssertionOptions.AssertEquivalencyUsing 会更改 Fluent 断言的静态状态,因此如果您正在并行运行测试,则应在运行 任何 测试之前调用它。 对于 NUnit,在 [SetUpFixture] 内的 [OneTimeSetUp] 不在命名空间内。

using FluentAssertions;
using FluentAssertions.Equivalency;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;

[SetUpFixture]
public class MySetUpClass

    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    
        AssertionOptions.AssertEquivalencyUsing(e => e.Using(new MyNamespace.MyClassSelectionRule()));
    


namespace MyNamespace

    class MyOuterClass
    
        public MyInnerClass MemberToInclude  get; set; 

        public int MemberToExclude  get; set; 
    

    class MyInnerClass
    
        public int AnotherMemberToInclude  get; set; 

        public int MemberToExclude  get; set; 
    

    internal class MyClassSelectionRule : IMemberSelectionRule
    
        public bool IncludesMembers => false;

        public IEnumerable<SelectedMemberInfo> SelectMembers(IEnumerable<SelectedMemberInfo> selectedMembers, IMemberInfo context, IEquivalencyAssertionOptions config) =>
            selectedMembers.Where(e => !(e.DeclaringType.Name == nameof(MyOuterClass) && e.Name == nameof(MyOuterClass.MemberToExclude)));
    

    [TestFixture]
    public class UnitTest1
    
        [Test]
        public void Ignore_the_member_MemberToExclude_on_MyOuterClass()
        
            var subject = new MyOuterClass
            
                MemberToInclude = new MyInnerClass
                
                    AnotherMemberToInclude = 42,
                    MemberToExclude = 42
                ,
                MemberToExclude = 1
            ;

            var expectation = new MyOuterClass
            
                MemberToInclude = new MyInnerClass
                
                    AnotherMemberToInclude = 42,
                    MemberToExclude = 42
                ,
                MemberToExclude = 2
            ;

            subject.Should().BeEquivalentTo(expectation);
        

        [Test]
        public void Do_not_ignore_the_member_MemberToExclude_on_MyInnerClass()
        
            var subject = new MyOuterClass
            
                MemberToInclude = new MyInnerClass
                
                    MemberToExclude = 1
                ,
            ;

            var expectation = new MyOuterClass
            
                MemberToInclude = new MyInnerClass
                
                    MemberToExclude = 2
                ,
            ;

            Action act = () => subject.Should().BeEquivalentTo(expectation);

            act.Should().Throw<AssertionException>();
        
    


【讨论】:

但要小心并行运行测试的测试框架。 AssertionOptions 改变静态状态。 感谢您的回答。有用。但是如何检查类型?如果我有两个类:FooBar,它们具有相同名称的字段 FieldName。我想从Foo 中排除它,但仍然检查它是否有Bar @SergеуIsupov 我已更新示例以使用名为 MemberToExclude 的成员处理多种类型

以上是关于全局等效配置。排除成员的主要内容,如果未能解决你的问题,请参考以下文章

路由基础之链路聚合和DHCP全局的地址池的配置

Swagger 动态条件注入及全局拦截配置影响分析

Swagger 动态条件注入及全局拦截配置影响分析

Hue的全局配置文件hue.ini(图文详解)

Spring Boot 全局懒加载

Spring Boot 全局懒加载