繁体   English   中英

如何在仍然引用 NUnit 的同时使我的 Visual Studio 2017 项目不是测试项目

[英]How can I make my visual studio 2017 project NOT a test project while still referencing NUnit

我有一个带有 unittest 助手类的库。 我在这个项目中引用了 NUnit,但现在 Visual Studio 认为这个项目是一个测试项目,并抱怨没有发现任何测试。 这个项目并不是一个测试项目,只是一个引用 NUnit 的常规 .net 标准库。

我想“说服”visual studio 这不是一个测试项目。 有任何想法吗?

技术细节:该项目是一个.Net Standard 2.0项目,我参考了以下NuGet包:

  • 最小起订量 4.10.0
  • 起订量.AutoMock 1.2.0.111
  • NUnit 3.10.1

我使用 Visual Studio 2017 企业版 15.8.4

该库的用途示例:

  public abstract class AutoMockerTestBase
  {
     protected AutoMocker AutoMocker { get; private set; }

     [SetUp]
     public virtual void SetUp()
     {
        AutoMocker = new AutoMocker(MockBehavior.Strict);
     }

     [TearDown]
     public virtual void TearDown()
     {
        AutoMocker.VerifyAll();
     }
  }

要重现问题:

  • 将 .net standard2.0 class 库项目添加到解决方案。
  • 参考 NUnit

现在请注意,Visual Studio 将项目图标更改为测试项目。

帮助我找到一种方法让 Visual Studio 不认为这个项目是一个测试项目,并确保 vs 不会尝试在这个项目中发现测试。

编辑:查看“测试” output 我发现了这个:

[16/09/2018 10:12:55 Warning] Exception NUnit.Engine.NUnitEngineException, Exception thrown discovering tests in C:\Users\me\Source\Repos\Shared\src\UnitTestHelpers\bin\Debug\netstandard2.0\Shared.UnitTestHelpers.dll
[16/09/2018 10:12:55 Warning] An exception occurred in the driver while loading tests.
[16/09/2018 10:12:55 Warning]    at NUnit.Engine.Runners.DirectTestRunner.LoadDriver(IFrameworkDriver driver, String testFile, TestPackage subPackage)
   at NUnit.Engine.Runners.DirectTestRunner.LoadPackage()
   at NUnit.Engine.Runners.TestDomainRunner.LoadPackage()
   at NUnit.Engine.Runners.DirectTestRunner.EnsurePackageIsLoaded()
   at NUnit.Engine.Runners.DirectTestRunner.Explore(TestFilter filter)
   at NUnit.Engine.Runners.MasterTestRunner.Explore(TestFilter filter)
   at NUnit.VisualStudio.TestAdapter.NUnit3TestDiscoverer.DiscoverTests(IEnumerable`1 sources, IDiscoveryContext discoveryContext, IMessageLogger messageLogger, ITestCaseDiscoverySink discoverySink) in D:\repos\nunit\nunit3-vs-adapter\src\NUnitTestAdapter\NUnit3TestDiscoverer.cs:line 90
[16/09/2018 10:12:55 Warning] Innerexception: System.IO.FileNotFoundException: Could not load file or assembly 'nunit.framework' or one of its dependencies. The system cannot find the file specified.
File name: 'nunit.framework'
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Activator.CreateInstance(String assemblyString, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo)
   at System.AppDomain.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityAttributes)
   at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityAttributes)
   at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityAttributes)
   at NUnit.Engine.Drivers.NUnit3FrameworkDriver.CreateObject(String typeName, Object[] args)
   at NUnit.Engine.Drivers.NUnit3FrameworkDriver.Load(String testAssemblyPath, IDictionary`2 settings)
   at NUnit.Engine.Runners.DirectTestRunner.LoadDriver(IFrameworkDriver driver, String testFile, TestPackage subPackage)

在 .csproj 文件中,您应该能够添加以下内容:

<PropertyGroup>
  <IsTestProject>false<IsTestProject>
</PropertyGroup>

这对我来说适用于引用 XUnit 的库,这些库不是测试库,它也适用于 NUnit。

如果在程序集级别应用NonTestAssemblyAttribute ,则会告诉 NUnit 它不是测试程序集。 但是,您必须查看在 Visual Studio 下运行时是否可以防止出现错误。

您是否检查过您的项目文件中是否有以下条目:

<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

它将项目定义为测试项目(旧样式)。

另请参见此处: 如何将现有程序集转换为 ms 单元测试程序集?

对我有用的是添加一个引用 NUnit 的新中间库项目,而主库项目仅引用中间库而不是直接引用 NUnit。

例如:

Solution
  \
   ----- MainLibrary
  \
   ----- IntermediaryLibrary
            \
             ------ NUnit

  • MainLibrary 引用了 IntermediaryLibrary。
  • 中间库安装了 NUnit package。

MainLibrary 的图标将是正常的库图标。 IntermediaryLibrary 的图标将是单元测试图标。

您仍然可以在 MainLibrary 中拥有引用 NUnit 的类并为单元测试创建辅助类型。

在我的场景中,我们有想要在共享库中定义的属性,而不是将共享库视为测试库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM