全局等效配置。排除成员
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
改变静态状态。
感谢您的回答。有用。但是如何检查类型?如果我有两个类:Foo
和 Bar
,它们具有相同名称的字段 FieldName
。我想从Foo
中排除它,但仍然检查它是否有Bar
@SergеуIsupov 我已更新示例以使用名为 MemberToExclude
的成员处理多种类型以上是关于全局等效配置。排除成员的主要内容,如果未能解决你的问题,请参考以下文章