FluentAssertionsを使用して、辞書の値が等しいかどうかを比較する方法を制御する方法はありますか?
私はクラスを持っており、その1つのプロパティは辞書(string / double)です。クラスの2つのインスタンス(期待されるものと実際のもの)を比較し、辞書のメンバーについて、「同等性」がどのように決定されるかを指定したいと思います。
示されているようなクラスがあると仮定します。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var t1 = new Thing();
t1.Name = "Bob";
t1.Values.Add("Hello", 100.111);
t1.Values.Add("There", 100.112);
t1.Values.Add("World", 100.113);
var t2 = new Thing();
t2.Name = "Bob";
t2.Values.Add("Hello", 100.111);
t2.Values.Add("There", 100.112);
t2.Values.Add("World", 100.1133);
t1.Should().BeEquivalentTo(t2);
}
}
public class Thing
{
public string Name { get; set; }
public Dictionary<string, double> Values { get; set; } = new Dictionary<string, double>();
}
たとえば、辞書の「World」エントリを比較する方法を指定できるようにしたいと思います。実際には、値が非常に大きいか、小数点以下10桁以上で同じである可能性がありますが(それ以降はそうではありません)、「1%未満の差でも同じ」のように言う必要があると思います。
FluentAssertionsがメンバーを教えてくれる方法と、それらが同じではない理由が好きで、カスタムIAssertionRule(Optionsラムダを使用)を試しましたが、辞書のメンバーではなく、クラスのプロパティを比較しているように見えました。
私は比較対象のクラスを所有していないため、「Equal」メソッドをオーバーライドできず、カスタム比較子(IEquatable)を指定する方法を見つけることができません-しかし、それらが同じでない理由の流暢な詳細を失うことになると思います。
可能であるが、(ディクショナリの値ではなく)クラスのプロパティであるdoubleにも任意のメソッドが適用される場合は、問題ありません。
ありがとう。
Nkosiの回答に続いて、これは私が使用しているBeApproximatelyの例です(での使用を許可BeApproximately
するためdecimal?
):
[CustomAssertion]
public static void BeApproximately(this NullableNumericAssertions<decimal> value, decimal? expected, decimal precision, string because = "",
params object[] becauseArgs)
{
if (expected == null)
value.BeNull(because);
else
{
if (!Execute.Assertion.ForCondition(value.Subject != null).BecauseOf(because)
.FailWith($"Expected {{context:subject}} to be '{expected}' {{reason}} but found null"))
return;
Decimal num = Math.Abs(expected.Value - (Decimal) value.Subject);
Execute.Assertion.ForCondition(num <= precision).BecauseOf(because, becauseArgs).FailWith("Expected {context:value} to approximate {1} +/- {2}{reason}, but {0} differed by {3}.", (object) value.Subject, (object) expected.Value, (object) precision, (object) num);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加