首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试ReSharper和NUnit给出了不同的结果

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

Stack Overflow用户
提问于 2014-11-21 13:30:19
回答 1查看 1.3K关注 0票数 6

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

测试的简化版本:

代码语言:javascript
复制
[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的输出:

代码语言:javascript
复制
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中的一个bug?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-21 13:48:54

最初,它是.NET框架中的一个bug。URI的替罪羊行为取决于环境(.NET框架版本和配置)。该错误在.NET Framework4.5中得到了修复。例如,让我们使用代码

代码语言:javascript
复制
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框架3.5中的输出:

代码语言:javascript
复制
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框架4.5中的输出:

代码语言:javascript
复制
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和斜杠转义有一个选项:

代码语言:javascript
复制
<configuration>
  <uri>
    <schemeSettings>
      <add name="http" 
           genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
  </uri>
</configuration>

我认为,在你的例子中,ReSharper和NUnit只是使用不同的信任。尽管NUnit收到了.NET 4.5的旧uri转义结果,这确实很奇怪。也许NUnit使用了.NET 4.0中的一些微软库。此外,通过手动将框架选项设置为CLR4.0,您可以在ReSharper中失败测试。无论如何,您应该用与环境无关的逻辑重写测试。

有用的链接:

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27062562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档