2016-10-05 2 views
1

У меня есть обычное исключение, которое принимает пару строк в ctor, за которым следует обычный параметр Exception innerException. Класс исключения украшен [Serializable]. Этот класс исключений MyException также наследует от MyBaseException, который, в свою очередь, наследует от Exception.Двоичный сериализует класс .NET Exception; модульное тестирование с FluentAssertions

Я пытаюсь выполнить тестирование, чтобы все параметры 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 и 4.14.0 FluentAssertions

EDIT:

Учитывая то, что @Evk обнаружил, я попытался вручную сериализации/десериализации Exception с 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.

+0

Попробуйте метание внутреннее исключение первого и проверить его в улове? (это просто случайное предположение). Кроме того, вы проверили [свой журнал ошибок] (https://github.com/dennisdoomen/fluentassertions/issues), возможно, даже файл один из своих? –

+0

У всех ваших настраиваемых типов исключений есть потоковые конструкторы, как показано в [на этом вопросе] (https://stackoverflow.com/questions/3422703/how-to-deserialize-object-derived-from-exception- класс с использованием-JSON-нетто-с)? Этот вопрос касается Json.NET, но 'BinaryFormatter' использует один и тот же конструктор для сериализации исключений. В отличие от этого вопроса, 'BinaryFormatter' требует, чтобы ваш конструктор вызывал конструктор' base'. – dbc

+0

На самом деле то же самое можно воспроизвести с помощью только «нового исключения» («некоторая ошибка»). Должно() BeBinarySerializable(); », поэтому это некоторая ошибка в библиотеке FluentAssertion, а не то, что ваши исключения действительно не сериализуемы. – Evk

ответ