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

C# 二进制序列化.NET异常派生类;使用FluentAssertions的单元测试,c#,unit-testing,fluent-assertions,C#,Unit Testing,Fluent Assertions,我有一个自定义异常,它在ctor中接受两个字符串,后跟通常的exception innerExceptionlast参数。异常类用[Serializable]修饰。此异常类MyException也继承自MyBaseException,后者又继承自exception 我正在尝试单元测试所有的ctor参数是否正常水合和脱水。这项工作: var error = new MyException("entityname1"); error.Should().BeBinarySerializable();

我有一个自定义异常,它在ctor中接受两个字符串,后跟通常的
exception innerException
last参数。异常类用
[Serializable]
修饰。此异常类
MyException
也继承自
MyBaseException
,后者又继承自
exception

我正在尝试单元测试所有的ctor参数是否正常水合和脱水。这项工作:

var error = new MyException("entityname1");
error.Should().BeBinarySerializable();
var error = new MyException("entityname1", new MyOtherException("some error"));
这不起作用:

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\"
正在抛出的错误没有可能给出问题的内部异常信息

有趣的是,这是有效的:

var error = new MyException("entityname1");
error.Should().BeBinarySerializable();
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中的一个bug。

这在FluentAssertions中已经修复:


这已在FluentAssertions中修复:


是否先尝试抛出内部异常,然后在捕获中检查它?(这只是一个随机猜测)。另外,您是否检查过,甚至可能是您自己的文件?是否所有自定义异常类型都具有流式构造函数,如中所示?这个问题是关于Json.NET的,但是BinaryFormatter使用相同的构造函数进行异常序列化。与该问题不同,
BinaryFormatter
要求构造函数调用
base
构造函数。实际上,只要“出现新异常(“某些错误”).Should().BeBinarySerializable();”,就可以复制该构造函数,因此这是FluentAssertion库中的一些错误,并不是说您的异常确实不可序列化。@ScottChamberlain如果在将其添加到异常之前抛出InvalidOperationException,则会发生同样的情况。@dbc是的,它们都具有流式计算器和GetObjectData方法。除了FluentAssertions似乎不喜欢innerException为非null之外,所有异常都按预期工作。是否先尝试抛出内部异常并在捕获中检查它?(这只是一个随机猜测)。另外,您是否检查过,甚至可能是您自己的文件?是否所有自定义异常类型都具有流式构造函数,如中所示?这个问题是关于Json.NET的,但是BinaryFormatter使用相同的构造函数进行异常序列化。与该问题不同,
BinaryFormatter
要求构造函数调用
base
构造函数。实际上,只要“出现新异常(“某些错误”).Should().BeBinarySerializable();”,就可以复制该构造函数,因此这是FluentAssertion库中的一些错误,并不是说您的异常确实不可序列化。@ScottChamberlain如果在将其添加到异常之前抛出InvalidOperationException,则会发生同样的情况。@dbc是的,它们都具有流式计算器和GetObjectData方法。除了FluentAssertions似乎不喜欢innerException为非null之外,所有异常都按预期工作。