二进制序列化 .NET 异常派生类;使用 FluentAssertions 进行单元测试

本文关键字:FluentAssertions 使用 单元测试 序列化 NET 异常 派生 二进制 | 更新日期: 2023-09-27 18:11:37

>我有一个自定义异常,它在 ctor 中接收几个字符串,后跟通常Exception innerException最后一个参数。异常类用 [Serializable] 进行修饰。此异常类MyException也继承自MyBaseException

而而又继承自Exception

我正在尝试单元测试所有 ctor 参数是否正确水合和脱水。这有效:

var error = new MyException("entityname1");
error.Should().BeBinarySerializable();

这不起作用:

var error = new MyException("entityname1",
    new InvalidOperationException("some error"));
error.Should().BeBinarySerializable();

它给出:

Expected MyException with message "Unable to sign-in “entityname1”."
 to be serializable, but serialization failed with:
Expected member InnerException
to be System.InvalidOperationException with message '"some error'"'n,
but found System.InvalidOperationException with message '"some error'"

引发的错误没有可能提供问题想法的 innerException 信息。

有趣的是,这有效:

var error = new MyException("entityname1", new MyOtherException("some error"));

知道为什么那个序列化失败和/或如何调试问题吗?

.NET 4.6.1 和 FluentAssertions 4.14.0

编辑:

鉴于@Evk发现的情况,我尝试使用 BinaryFormatter 手动序列化/反序列化异常,它似乎工作正常:

var formatter = new BinaryFormatter();
var source = new Exception("some error");
byte[] buffer;
using (var stream = new MemoryStream())
{
    formatter.Serialize(stream, source);
    buffer = new byte[stream.Length];
    stream.Position = 0;
    stream.Read(buffer, 0, buffer.Length);
}
using (var stream = new MemoryStream(buffer))
{
    var ex = (Exception)formatter.Deserialize(stream);
    ex.ToString().Should().Be(source.ToString());
}

所以也许这是FluentAssertions中的一个错误。

二进制序列化 .NET 异常派生类;使用 FluentAssertions 进行单元测试

这已在 FluentAssertions 中修复:

BeBinarySerializable 失败并出现标准 .NET 异常,但不出现自定义异常