繁体   English   中英

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

[英]Binary serialize a .NET Exception-derived class; unit testing with FluentAssertions

我有一个自定义异常,它接受ctor中的几个字符串,后跟通常的Exception innerException last参数。 异常类用[Serializable]修饰。 此异常类MyException也继承自MyBaseException ,而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手动序列化/反序列化Exception,它似乎工作正常:

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中的一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM