C# 单元测试ReSharper和NUnit给出了不同的结果

C# 单元测试ReSharper和NUnit给出了不同的结果,c#,.net,unit-testing,nunit,resharper,C#,.net,Unit Testing,Nunit,Resharper,在本地计算机上使用ReSharper 8.2,在生成服务器上使用NUnit 2.6.3,发现某些测试在ReSharper中通过,但在NUnit中失败。本地安装NUnit,结果相同,因此计算机之间没有差异。我的两个同事做了同样的测试,结果也一样,所以我的电脑似乎没有什么问题 测试的简化版本: [Test] public void Test_UrlQueryString() { var urlInput = "http://www.domain.com/page-with-querystri

在本地计算机上使用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中的bug还是NUnit中的bug

最初,它是.NET Framework中的一个bug。URI scaping行为取决于环境(.NET Framework版本和配置)。该缺陷在.NETFramework4.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>



  • 这正是正确的答案,但它缺少一点关键信息-.net 4.5有一个“怪癖模式”(如中所述,它给出了在.net 4.0应用程序中运行时的.net 4.0行为。您需要使用最新的ReSharper 8.2.3才能获得正确运行的版本-无怪癖模式。是的,似乎ReSharper中存在错误。