从html文件读取字节数据会在不同的机器上生成不同的字节数组

时间:2018-08-21 18:02:30

标签: c# html arrays unit-testing

在为使用Razor引擎生成html的项目进行单元测试时,我发现了一个非常奇怪的场景。

为了使单元测试正确,我对模型硬编码,称为函数,并保存了生成的html代码。我们的业务用户查看了生成的html并给予了认可,我们的设计师检查了html代码并说一切看起来都很好。

我现在有一个html文件,可以在单元测试中与之比较,以确保在给定完全相同的模型数据的情况下,对代码的任何更改都不会产生不同的html文件。

在我的本地开发计算机上,比较字节数组(File.ReadAllBytes(path))时,单元测试通过。但是,在我们的构建代理上,单元测试由于额外的ASCII 13个字节而失败,这是字节数组的一部分片段:

  Build Agent: 111-100-121-62-13-10-32-32-32
Local Machine: 111-100-121-62-10-32-32-32

我不确定这是怎么回事或如何解决。这正常吗?我将如何重写测试以解决此问题?


其他信息:

  • 构建代理正在运行Windows Server 2016,Visual Studio 2017 15.7.6
  • 我的本地开发箱正在运行Windows 10 Enterprise 10.0.14393,Visual Studio 2017 15.8.1

1 个答案:

答案 0 :(得分:0)

“给定完全相同的模型数据的不同html文件”:无限多个不同的HTML文件在解析时在语义上是等效的,在呈现时甚至更多。

但是,要克服障碍(如果您不需要考虑<pre>和相关元素中的换行符),您可以

//Note: Ignoring newlines because they are believed to be insignificant. No <pre> etc expected.
// This allows newlines to vary across systems and across time.
Func<String, List<String>> splitByLineAndRemoveEmpty = 
    input => Regex.Split(input, @"\r|\n").Where(line => !String.IsNullOrEmpty(line)).ToList();

CollectionAssert.AreEqual(
    splitByLineAndRemoveEmpty(expected), 
    splitByLineAndRemoveEmpty(File.ReadAllText(path)));

这可能会使测试罐走得更远,以至于在一段时间内不会再困扰任何人。