【问题标题】:Unit test ReSharper and NUnit give different results单元测试 ReSharper 和 NUnit 给出不同的结果
【发布时间】:2014-11-21 13:30:19
【问题描述】:

在本地计算机上使用 ReSharper 8.2 和在构建服务器上使用 NUnit 2.6.3 发现有一些测试在 ReSharper 中通过并且在 NUnit 中失败。在本地安装 NUnit 并且结果相同,因此计算机之间没有区别。我的两个同事进行了相同的测试,得到了相同的结果,所以我的电脑似乎没有什么问题。

测试的简化版本:

[Test]
public void Test_UrlQueryString()
{
    var urlInput = "http://www.domain.com/page-with-querystring?url=https://www.domain2.com/page%3Fp%3DPEPE";
    var uri = new Uri(urlInput);

    Assert.AreEqual(urlInput, uri.ToString());
}

[Test]
public void Test_Dot()
{
    var urlInput = "http://www.domain.com/page-with-dot.?p=google";
    var uri = new Uri(urlInput);

    Assert.AreEqual(urlInput, uri.ToString());
}

ReSharper 输出全部为绿色。 NUnit 的输出:

Runtime Environment -
   OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
  CLR Version: 4.0.30319.18444 ( Net 4.5 )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: net-4.5
...................F.F.........
Tests run: 29, Errors: 0, Failures: 2, Inconclusive: 0, Time: 0.576769973208475 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

Errors and Failures:

  1) Test Failure : Test.OrganicTest.Test_Dot
     Expected string length 45 but was 44. Strings differ at index 35.
  Expected: "http://www.domain.com/page-with-dot.?p=google"
  But was:  "http://www.domain.com/page-with-dot?p=google"
  ----------------------------------------------^

  2) Test Failure : Test.OrganicTest.Test_UrlQueryString
     Expected string length 87 but was 83. Strings differ at index 76.
  Expected: "...-with-querystring?url=https://www.domain2.com/page%3Fp%3DPEPE"
  But was:  "...-with-querystring?url=https://www.domain2.com/page?p=PEPE"
  ----------------------------------------------------------------^

ReSharper 似乎使用的是相同版本的 NUnit(内置 NUnit 2.6.3)

有谁知道如何解决这个问题?这是 ReSharper 或 NUnit 中的错误吗?

【问题讨论】:

    标签: c# .net unit-testing nunit resharper


    【解决方案1】:

    最初,它是 .NET Framework 中的一个错误。 URI scaping 行为取决于环境(.NET Framework 版本和配置)。该错误已在 .NET Framework 4.5 中修复。比如我们拿代码

    var uri1 = "http://www.domain.com/page-with-dot.?p=google";
    var uri2 = "http://www.domain.com/page-with-querystring?url=https://www.domain2.com/page%3Fp%3DPEPE";
    Console.WriteLine(new Uri(uri1).ToString());
    Console.WriteLine(new Uri(uri2).ToString()); 
    

    .NET Framework 3.5 中的输出:

    http://www.domain.com/page-with-dot?p=google
    http://www.domain.com/page-with-querystring?url=https://www.domain2.com/page?p=PEPE
    

    .NET Framework 4.5 中的输出:

    http://www.domain.com/page-with-dot.?p=google
    http://www.domain.com/page-with-querystring?url=https://www.domain2.com/page%3Fp%3DPEPE
    

    此外,您可以使用 .config 文件对转义行为进行一些更改。例如,.NET 4.0 有一个选项和斜线转义:

    <configuration>
      <uri>
        <schemeSettings>
          <add name="http" 
               genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
        </schemeSettings>
      </uri>
    </configuration>
    

    我认为,就您而言,ReSharper 和 NUnit 只是使用不同的配置。虽然很奇怪,NUnit 收到了 .NET 4.5 的旧 uri 转义结果。也许 NUnit 使用 .NET 4.0 中的一些微软库。此外,您可以通过手动将 Framework 选项设置为 CLR4.0 来使 ReSharper 中的测试失败。无论如何,你应该用独立于环境的逻辑重写测试。

    有用的链接:

    【讨论】:

    • 这完全是正确的答案,但它缺少关键信息 - .net 4.5 有一个“怪癖模式”(如 this blog post 中所述,它在运行时给出了 .net 4.0 的行为.net 4.0 应用程序。您需要拥有最新的 ReSharper 8.2.3 才能获得正常运行的版本 - 无怪癖模式。请参阅 this YouTrack issue for the ReSharper bug
    • 是的,似乎 Resharper 中存在错误。
    猜你喜欢
    • 2016-05-06
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2022-06-17
    相关资源
    最近更新 更多