c# - 全局等效配置。排除成员
问题描述
我想知道是否可以为测试进行全局配置。我知道我可以像这样比较这个对象:
x.Should().BeEquivalentTo(y, opt => opt.Excluding(z => z.Member)
但我希望我的测试中的所有方法都使用这个配置。
解决方案
要从特定类型中排除成员,您可以创建自定义IMemberSelectionRule
.
要对所有测试使用该选择规则,AssertionOptions.AssertEquivalencyUsing
请在单元测试框架的某些设置方法中使用静态。请注意,AssertionOptions.AssertEquivalencyUsing
Fluent Assertions 的静态状态会发生变化,因此如果您正在并行运行测试,则应在运行任何测试之前调用它。对于不在命名空间[OneTimeSetUp]
内的NUnit。[SetUpFixture]
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>();
}
}
}
推荐阅读
- apache-spark - 尽管控制台接收器工作正常,但写入内存接收器时出现火花流问题
- php - 如何在 Laravel 中制作控制器单例?
- php - Symfony 依赖注入注入一个类型的所有类作为参数
- javascript - 如何在嵌套组件中处理 EmberJS 中的操作
- sql-server - 数据建模设计
- arrays - 如何在列表中找到存储另一个列表的元素并获取索引?
- ms-access - MS Access 不会链接到已编译后端中的表
- django - Django 按两个字段的值计数和分组
- matlab - 如何从给定的起点获取新数据?
- php - 如何在 PHP、Laravel 中管理标签的翻译?