17

Fluent アサーションでは、オブジェクトを DateTime プロパティと比較すると、ミリ秒単位でわずかな不一致が発生し、比較が失敗することがあります。これを回避する方法は、比較オプションを次のように設定することです。

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

これを一度設定して、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);
        }
    }
}
4

3 に答える 3

18

実際、できます。既定の構成ファクトリは、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;
};

必要に応じて、現在のデフォルトを取得し、それをファクトリ メソッドから使​​用する変数に入れることができます。

于 2013-12-20T12:06:50.413 に答える