Unit testing Suppress F#编译器警告:可能缩进不正确:此标记与上下文无关

Unit testing Suppress F#编译器警告:可能缩进不正确:此标记与上下文无关,unit-testing,f#,compiler-warnings,readability,xunit,Unit Testing,F#,Compiler Warnings,Readability,Xunit,我有一些xunit测试,为了可读性,我想如下布局: [<Fact>] let ``Has Hash Code 2``() = target.GetHashCode().ShouldBe 2 [<Fact>] let ``ToString yields two``() = target.ToString().ShouldBe "two" [<Fact>] let ``Has underlysing type int``() = tar

我有一些xunit测试,为了可读性,我想如下布局:

[<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
[<Fact>] let ``ToString yields two``()      = target.ToString().ShouldBe "two"
[<Fact>] let ``Has underlysing type int``() = target.GetUnderlyingType().ShouldBe typeof<int>
[]让`` Has Has Hash code 2`()=target.GetHashCode()。应该是2
[]让``ToString产生两个`()=target.ToString()。应该是“两个”
[]让“%Has underlysing type int``()=target.GetUnderlyingType()。应为typeof
我在let语句上收到一条编译器警告:“可能缩进不正确:此令牌与从位置%s开始的上下文越位。请尝试进一步缩进此令牌或使用标准格式约定。”

我尝试了
#nowarn“lexflttokenisoffsideofcideofcontextstartedprevious”
,但这只是生成了另一个编译器警告“无效警告号”

中没有为此错误列出警告号

有没有办法抑制此警告?

试试以下方法:

#nowarn "0058"
要找出正确的警告号,只需在命令行(或在VS中,然后转到View->Output->build)中构建这个东西,它就会告诉您。以下是我看到的:

Program.fs(7,3): warning FS0058: Possible incorrect indentation: this token is offside of context started at position (5:25). Try indenting this token further or using standard formatting conventions.

我很抱歉以一种风格回答“你不需要它”,但事实似乎就是这样。此外,这个问题显然成为了那些用F#编写单元测试的人的常见问题。另一个例子是
[]

无论如何,在项目级甚至文件级禁用警告似乎是个坏主意,除非您有充分的理由这样做

据我所知,您希望语句成为一行(例如,
[]
没有占用整行)。在VS2013中,有两种方法可以实现这一点:

  • 将属性放在
    中,让

    let [<Fact>] ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
    
    let[]``具有哈希代码2``()=target.GetHashCode()。应为2
    
  • 在声明后写一个双分号:

    [<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2;;
    
    []让`` Has Has Hash code 2`()=target.GetHashCode()。应该是2;;
    

  • 非常感谢。我同意你的选择1。很高兴听到有一种不禁用警告的方法可以做到这一点。我刚刚开始在C代码库上用F编写单元测试,以此来学习F,并编写更简洁易读的测试。你能解释一下你所说的“另一个案例是针对[]的”是什么意思吗?您还可以向F#单元测试新手推荐一些贴士/文章吗?@Craig,例如,使用Web API的库通常保留许多硬编码常量,例如部分URL、数值等。它们通常在MSDN中标记为
    []
    属性。如果有很多这样的代码,开发人员可能也希望它们是一行代码,就像在您的问题中一样,它们也会有完全相同的问题(注意:MSDN文章的属性在单独的一行中!)。我在回答中提到了这一点,以便在网络上搜索解决方案的人能够找到这个答案。谢谢。由于某些原因,我没有在我的生成输出中显示文本“warning FS0058:”的部分。这是因为您正在查看错误窗口,而不是生成输出。要获得真正的构建输出,请转到查看->输出,然后在下拉列表中选择“构建”。太好了。谢谢在构建输出中,我可以看到一行红色的C:\ProgramFiles(x86)\Microsoft SDK\F\35;\ 3.1\Framework\v4.0\fsc.exe-o:obj\Debug\TestFastLibValueObj.dll-g--Debug:full--noframework--define:Debug--define:TRACE--doc bin\Debug\TestFastLibValueObj.XML--optimize--tailcalls--r:“C:\Program Files(x86)\参考Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.1.0\FSharp.Core.dll“-r:C:\Users\azuretools\Documents\GitHub\TaPrivate\CoreComponents\bin\Debug\LibBase.dll-
    等。但是,它似乎没有给出特定的错误,并且构建成功完成。我可以忽略它吗?