【问题标题】:How can I get Resharper to treat Specflow Bindings, Step Def etc. annotations as Implicitly Used如何让 Resharper 将 Specflow 绑定、Step Def 等注释视为隐式使用
【发布时间】:2014-04-29 20:45:26
【问题描述】:

我正在使用带有 Specflow 的 Reshaper,ResharperCode 检查将步骤定义、绑定和挂钩标记为从未使用过。

我尝试使用here的答案

但未能成功获取正确拾取的外部注释。这是我在外部注释文件中尝试的内容:-

<assembly name="TechTalk.SpecFlow.dll">
  <member name="T:TechTalk.SpecFlow.BindingAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.GivenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
    <member name="T:TechTalk.SpecFlow.WhenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.ThenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
</assembly>

我尝试将其保存在 C:\Program Files (x86)\JetBrains\ReSharper\v8.2\Bin 和 C:\Program Files (x86)\JetBrains\ReSharper\v8.2\Bin\ExternalAnnotations 中(不太清楚应该去哪里,因为默认安装中不存在 ExternalAnnotations 文件夹)

但是当我关闭并重新打开 VS 时,Inspection 仍然会选择未使用的绑定和步骤定义:-

Solution qdf.AcceptanceTests.sln
Project Alpari.QualityAssurance.SpecFlowExtensions
  Alpari.QualityAssurance.SpecFlowExtensions\Steps\CrossStepDefinitionFileTwo.cs:7 Class 'CrossStepDefinitionFileTwo' is never used
  Alpari.QualityAssurance.SpecFlowExtensions\Steps\CrossStepDefinitionFileTwo.cs:10 Method 'GivenICreateAnInstanceOfStepDefinitionOneFromStepDefinitionTwo' is never used
  Alpari.QualityAssurance.SpecFlowExtensions\Steps\CrossStepDefinitionFileTwo.cs:42 Method 'GivenICallAMethodInStepDefinitionTwoThatCallsTheSameMethodInStepDefinitionFileOne' is never used

谁能告诉我我在配置这个时做错了什么?

EDIT 完成了在 Alexander 的帖子之后运行良好的 xml:-

<!--Deploy to %ReSharperInstallDir%\Bin\ExternalAnnotations
    to check the ExternalAnnotations have worked, highlight one and press Ctrl-Shift-F1
    see https://stackoverflow.com/questions/23359738/how-can-i-get-resharper-to-treat-specflow-bindings-step-def-etc-annotations-as
    for additional info
-->
<assembly name="TechTalk.SpecFlow">
  <member name="T:TechTalk.SpecFlow.BindingAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.GivenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.WhenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.ThenAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeTestRunAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterTestRunAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeFeatureAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterFeatureAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeScenarioAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterScenarioAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeScenarioBlockAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterScenarioBlockAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.BeforeStepAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.AfterStepAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.StepArgumentTransformationAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.StepDefinitionAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
  <member name="T:TechTalk.SpecFlow.ScopeAttribute">
    <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
  </member>
</assembly>  

【问题讨论】:

    标签: binding annotations resharper specflow


    【解决方案1】:
    1. 将您的 TechTalk.SpecFlow.xml 放入 C:\Program Files (x86)\JetBrains\ReSharper\v8.2\Bin\ExternalAnnotations\;

    2. 从您提到的 xml 中的 &lt;assembly name="TechTalk.SpecFlow.dll"&gt; 中删除“.dll”扩展名以获得 &lt;assembly name="TechTalk.SpecFlow"&gt;

    3. 重新打开 Visual Studio;

    4. 为解决方案清理 ReSharper 缓存;

    【讨论】:

    【解决方案2】:

    看起来不错,但是从 ReSharper 8.2 开始,外部注释被部署为 ReSharper 的扩展(在扩展管理器中),因此它们不再位于 Program Files 下。

    你可以做的,只是为了测试它是否有效,将文件命名为TechTalk.SpecFlow.ExternalAnnotations.xml,并将它放在你的 DLL 旁边(我假设你正在使用 SpecFlow Nuget 包,所以暂时把它放在那里,在库)。您需要重新加载您的解决方案。然后,您应该能够查看是否应用了这些属性。您还可以使用 QuickDoc 功能(通过在属性上按 Ctrl-Q 或 Ctrl-Shift-F1)来确定是否应用了该属性,例如:

    如果这确实有效,那么您可以自己将注释分发为ReSharper extension

    【讨论】:

    • 感谢 Igal 的建议。所以我应该把 XML 放在 nuget 包内的 specflow dll 旁边吗?我是否需要在我的项目或解决方案中添加引用或明确包含该文件?另外,如果是 XML 文件,为什么要重命名为 .dll?
    • 哎呀,你是对的,我的意思是.xml!我编辑了答案,谢谢!我想让你把它放在 nuget 中的 DLL 旁边,看看它是否有效。 ReSharper 在外部注释(使用AssemblyName\anything.xml 约定)或实际 DLL 旁边(使用DllName.ExternalAnnotations.xml 约定)查找注释。如果它有效,也就是说,ReSharper 会加载注释,并且它使您的方法显示为“已使用”,那么您就知道它有效,并且可以自己将注释放入一个包中以分发给每个人。
    • 查看 R# API 文档的 Packaging 部分,它列出了外部注释的命名约定:confluence.jetbrains.com/display/NETCOM/1.06+Packaging+%28R8%29
    • 关于快速文档的好提示!请参阅下面我使用的 xml - 随意基于此制作 Nuget 包!
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多