C#Fluent断言ShouldBeEquivalentTo的全局选项

Haw*_*awk 15 c# fluent-assertions

在Fluent Assertions中,将对象与DateTime属性进行比较时,有时会在毫秒内出现轻微的不匹配,并且比较失败.我们解决它的方法是设置比较选项,如下所示:

actual.ShouldBeEquivalentTo(expected,
        options =>
            options.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation))
                .WhenTypeIs<DateTime>());
Run Code Online (Sandbox Code Playgroud)

有没有办法设置一次并让它始终适用,而不是每次调用ShouldBeEquivalentTo时都必须指定它?

Update1:​​尝试了以下方法,但它似乎不起作用,测试失败1毫秒的差异.工厂似乎没有调用新的默认值.

using System;
using FluentAssertions;
using FluentAssertions.Equivalency;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    class Test
    {
        public DateTime TestDateTime { get; set; }
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void SettingFluentAssertionDefault()
        {
            // arrange
            var defaultAssertionOptions = EquivalencyAssertionOptions<DateTime>.Default;

            EquivalencyAssertionOptions<DateTime>.Default = () =>
            {
                var config = defaultAssertionOptions();
                config.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTime>();
                return config;
            };

            var testDateTime = DateTime.Now;
            var expected = new Test {TestDateTime = testDateTime};

            // act
            var actual = new Test {TestDateTime = testDateTime.AddMilliseconds(1)};

            // assert
            actual.ShouldBeEquivalentTo(expected);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ton*_*722 17

现在可以使用AssertionOptions静态类完成此操作.使用一个简单的例子:

[TestInitialize]
public void TestInit() {
  AssertionOptions.AssertEquivalencyUsing(options => options.ExcludingMissingMembers());
}
Run Code Online (Sandbox Code Playgroud)

或者如上例所示:

AssertionOptions.AssertEquivalencyUsing(options =>
  options.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTime>()
);
Run Code Online (Sandbox Code Playgroud)

  • 万一有人像我一样愚蠢 - 记住静态,这些选项在整个测试过程中都会持续存在(这当然是OP的要求).我有一个测试,设置选项忽略具有特定名称的属性的等效性比较,假设在每个测试中重新分配.事实并非如此,它每次都会添加一条新规则,因此每个测试都使用了之前测试的"忽略列表"以及它自己的.学习到教训了.... (3认同)

Den*_*men 15

实际上,你可以.默认配置工厂由static属性公开EquivalencyAssertionOptions<Test>.Default.您可以轻松地为特定数据类型分配备用配置,或使用其他行为扩展默认配置.就像是:

var defaultAssertionOptions = EquivalencyAssertionOptions<Test>.Default;

EquivalencyAssertionOptions<Test>.Default = () =>
{
    var config = defaultAssertionOptions();
    config.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTime>();
    return config;
};
Run Code Online (Sandbox Code Playgroud)

如果你想要你可以得到当前的默认值并将其收集在你从工厂方法中使用的某个变量中.