Catel:反序列化适用于1单元测试,不适用于另一个单元测试

时间:2017-03-04 04:27:55

标签: c# unit-testing serialization catel

使用VS 2015。

我正在将我的应用程序从Catel 4.4.0升级到4.5.4。当然,使用SavableModelBase.Load参数对模型进行了大量更改,但是我修复了这些更改,所有内容都编译完成,没有错误或警告。

我运行了单元测试,但是有一个测试失败了。该测试需要委托加载先前已序列化的XML数据文件。然后,委托按年份从集合中检索YearConstants实例。代表是:

public static YearConstants GetYearConstantsByYearAndFileName(int year, string fileName)
    {
        using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
        {
            var constants = ConstantsData.Load(fs, SerializationMode.Xml, null);
            var results = constants.YearConstantsList.Where(x => x.Year == year).FirstOrDefault();
            if (results == null)
            {
                throw new ArgumentOutOfRangeException(string.Format(CultureInfo.InvariantCulture, "YearConstants not found for [{0}] in file [{1}]", year, fileName));
            }

            return results;
        }
    }

运行使用此委托的单元测试时,“常量”var具有值,但不包含任何年份数据。当我打破所有CLR异常时,我得到以下异常:

System.InvalidCastException occurred
  HResult=-2147467262
  Message=Unable to cast object of type 'Catel.Runtime.Serialization.Xml.XmlSerializationContextInfo' to type 'Catel.Runtime.Serialization.Binary.BinarySerializationContextInfo'.
  Source=Catel.Core
  StackTrace:
       at Catel.Runtime.Serialization.SerializerBase`1.Deserialize(Object model, ISerializationContextInfo serializationContext, ISerializationConfiguration configuration) in C:\CI_WS\Ws\97969\Source\Catel\src\Catel.Core\Catel.Core.Shared\Runtime\Serialization\SerializerBase.deserialization.cs:line 154
  InnerException: 

我添加了一个单元测试来测试加载相同的文件,它没有例外地通过:

    [TestMethod]
    [DeploymentItem(@"TestData\GeorgiaConstants.xml")]
    public void ConstantsData_SerializationWithLiveDataTest()
    {
        using (var fs = new FileStream("GeorgiaConstants.xml", FileMode.Open, FileAccess.Read))
        {
            var constants = ConstantsData.Load(fs, SerializationMode.Xml, null);
            Assert.IsNotNull(constants, "The constants data was not correctly loaded from 'GeorgiaConstants.xml' file.");
            Assert.AreEqual(5, constants.YearConstantsList.Count, "The expected number of year constants was not loaded from the 'GeorgiaConstants.xml' file.");

            // We should have year constants for 2016 for a while in the file.
            var yearConstants = constants.YearConstantsList.Where(x => x.Year == 2016).FirstOrDefault();
            Assert.IsNotNull(yearConstants, "The year constants for year = 2016 were not found in 'GeorgiaConstants.xml' file.");

            // We shouldn't be able to find year constants for a year this old.
            yearConstants = constants.YearConstantsList.Where(x => x.Year == 1999).FirstOrDefault();
            Assert.IsNull(yearConstants, "The year constants for year = 1999 were UNEXPECTEDLY found in 'GeorgiaConstants.xml' file.");
        }
    }

两个文件流都显示相同的字节数。此外,常量XML文件包含正确读取的“已创建”日期,“已修改”日期和“已创建”字符串。如果我自己运行失败的单元测试,它仍然会失败,所以它似乎不是文件共享/锁定问题。只是第二个代码正确读取了年常量的ObservableCollection,而不是第一个代码。

我已经没事了。有没有人对我可以使用的这种或其他方法的原因提出建议?

感谢, 好色

1 个答案:

答案 0 :(得分:1)

看起来它混淆了Xml和Binary序列化方法。请在official issue tracker创建一张票,这样就可以修复了。