【问题标题】:How do I unit test object serialization/deserialization in VB.NET 1.1?如何在 VB.NET 1.1 中对对象序列化/反序列化进行单元测试?
【发布时间】:2008-11-18 17:00:44
【问题描述】:

我正在寻找提供单元测试以序列化和反序列化内存流中的对象的示例代码。我找到了examples using C# 2.0,但是我当前的项目使用的是 VB.NET 1.1(不要问我为什么......),所以解决方案不能使用泛型。我也在使用 NUnit 框架进行单元测试。

谢谢!

【问题讨论】:

    标签: vb.net unit-testing serialization nunit .net-1.1


    【解决方案1】:

    这是我确定的模式:

    <Test()> _
    Public Sub SerializationTest()
        Dim obj As New MySerializableObject()
        'Perform additional construction as necessary
    
        Dim obj2 As MySerializableObject
        Dim formatter As New BinaryFormatter
        Dim memoryStream As New MemoryStream()
    
        'Run through serialization process
        formatter.Serialize(memoryStream, obj)
        memoryStream.Seek(0, SeekOrigin.Begin)
        obj2 = DirectCast(formatter.Deserialize(memoryStream), MySerializableObject)
    
        'Test for equality using Assert methods
        Assert.AreEqual(obj.Property1, obj.Property1)
        'etc...
    End Sub
    

    【讨论】:

    • 这看起来像是使用理论会有所帮助的情况。来自shareandenjoy.saff.net/tdd-specifications.pdf(使用 Java/Junit 示例,但 NUnit 中的概念相同):“根据我们的经验,好的理论通常是某种身份。如果必须添加一个方法来编写身份,它通常会填写一个现有 API 的明显差距。”在这种情况下,标识是“当我序列化一个对象,然后通过反序列化该输出创建一个新对象时,新对象应该与原始对象相同。”见nunit.org/index.php?p=theory&r=2.5.5
    【解决方案2】:

    NUnit 内置了对此的支持,这使它变得相当容易:

    Dim obj As New MySerializableObject()
    Assert.That(obj, Is.BinarySerializable)
    

    或者对于xml:

    Dim obj As New MySerializableObject()
    Assert.That(obj, Is.XmlSerializable)
    

    【讨论】:

    • 直到现在我才知道这个,一直在使用它,好多了:)
    【解决方案3】:

    如果您只想确保它们是可序列化的,那么您应该做的就是对对象进行序列化并确保没有引发 XmlSerializationException

    [Test]
    public void ClassIsXmlSerializable()
    {
       bool exceptionWasThrown = false;
    
       try
       {
          // .. serialize object
       }
       catch(XmlSerializationException ex)
       {
          exceptionWasThrown = true;
       }
    
       Asset.IsFalse(exceptionWasThrown, "An XmlSerializationException was thrown. The type xx is not xml serializable!");
    }
    

    【讨论】:

    • 抱歉没有看到您使用的是 VB.NET。如果您希望我为您翻译成 VB.NET,请告诉我
    • 不用了,我可以很舒服地阅读C#。但是,我遇到了一些情况,其中 VB.NET 和 C# 在某些功能上存在很大差异(例如使用 [field:NonSerialized] 属性声明时,这似乎在 VB.NET 中不受支持)。
    • 如果这是您的问题的解决方案,那么请将其作为答案
    【解决方案4】:

    嗯...所以您正在尝试为序列化编写单元测试?还是用于流?希望这已经由 MS 完成...但是如果您不信任或自己实现某些东西...您可以用一些数据填充对象,保存它,恢复它,并检查字段值是否到位?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多