【问题标题】:Xunit The following constructor parameters did not have matching fixture dataXunit 以下构造函数参数没有匹配的夹具数据
【发布时间】:2016-09-11 21:45:28
【问题描述】:

我在为 .NET 1.0 框架 net46 使用 XUnit 时不断收到此错误。

以下构造函数参数没有匹配的夹具数据

我看过这篇文章:Collection fixture won't inject 并严格按照此处所述的有关收集夹具的说明进行操作:

http://xunit.github.io/docs/shared-context.html#collection-fixture

似乎没有任何效果。

对可能导致此问题的任何建议?

【问题讨论】:

    标签: .net xunit


    【解决方案1】:

    在我的情况下,事实证明是按照说明正确操作的问题。错误地我用

    注释了这个类
     [Collection("ProjectCollection")]
    

    代替:

     [Collection("ActorProjectCollection")]
    

    我必须说,如果错误消息给出更明确的错误提示,XUnit 的依赖注入机制将得到极大的改进。

    【讨论】:

    • 使用nameof(ActorProjectCollection)可能有助于防止这些拼写错误
    【解决方案2】:

    另一种可能失败的情况是[CollectionDefinition] 是在执行测试程序集之外的类型上定义的。属性本身需要在其内部定义,否则 xUnit 不会拾取它。

    【讨论】:

    • 这发生在我身上。 CollectionDefinitionCollection定义的类有不同的命名空间。
    【解决方案3】:

    当您的夹具类的构造函数由于其他问题而失败时,可能会出现此异常,在我的例子中是连接到本地 Mongo 服务器。

    要么寻找其他故障并首先解决这些故障,要么减轻您的构造函数的负担,使其做得更少。

    【讨论】:

      【解决方案4】:

      就我而言,我必须在测试类上实现 IClassFixture 接口。

      public class MyTests : IClassFixture<QueryTestFixture>
      

      在我将 QueryTestFixture 移动到另一个项目后,Class 属性停止工作

      [Collection("QueryCollection")]
      

      与夹具类中的实现相关联(见下文)

      [CollectionDefinition("QueryCollection")]
      public class QueryCollection : ICollectionFixture<QueryTestFixture> { }
      

      我尝试了许多替代方法来解决这个问题,但最终reading the xunit.net explanation about shared context. 提供了一个解决方案。

      【讨论】:

        【解决方案5】:

        在添加 CollectionCollectionDefinition 装饰器后,我发生了几次,我在互联网上查找时总是得到这个答案。

        但在我的情况下,问题只是在测试它是否有效之前似乎需要一个 'Clean Solution' 操作。如果不清理解决方案,我总是会收到 The following constructor parameters did not have matching fixture data 错误。

        所以,我也写下这个答案,以帮助我未来的自己。


        无论如何,为了避免Nikola Schou解释的问题,你总是可以使用一个常量来避免名称不匹配:

        public static class Collections
        {
            public const string ActorProjectCollection= "ActorProjectCollection";
        }
        

        -

        [Collection(Collections.ActorProjectCollection)]
        /// ...
        

        -

        [CollectionDefinition(Collections.ActorProjectCollection)]
        /// ...
        

        【讨论】:

        • 我遇到了同样的问题。重构我的装置后,我无法一次执行多个测试(如果我一个接一个地运行它们,它们就可以工作)。在 VS 中进行清理后,它工作正常。
        • 请记住,每个集合键只能有一个用 CollectionDefinition 装饰的类。
        【解决方案6】:

        我的两分钱: 查看发布的回复,我检查了以下内容:

        • CollectionDefinition(X) 和 Collection(X) 类在同一个程序集中
        • 定义和使用它的类都引用同一个集合名称
        • 使用该定义的类有一个接收夹具的构造函数

        但仍然无法正常工作...有什么问题?具有该定义的类没有public 修饰符 (class Definition ...),而使用该定义的类具有它。

        只需将public 添加到定义中,它就像一个魅力。

        【讨论】:

          【解决方案7】:

          在同一个命名空间中定义

            [CollectionDefinition("Integration Tests", DisableParallelization = true)]
              public class TestCollection : ICollectionFixture<WebApplicationFactory<Startup>>
              {
                  // This class has no code, and is never created. Its purpose is simply
                  // to be the place to apply [CollectionDefinition] and all the
                  // ICollectionFixture<> interfaces.
              }
          

          在同一个命名空间中使用

              [Collection("Integration Tests")]
              public class BasicControllerTests
              {
                  private readonly WebApplicationFactory<Startup> _factory;
          
                  public BasicControllerTests(WebApplicationFactory<Startup> factory)
                  {
                      _factory = factory;
                  }
          
           ...
          

          source

          【讨论】:

            【解决方案8】:

            在我的情况下,我没有公开 FixtureClass

               [CollectionDefinition(nameof(ApiTestCollection))]
                **public** class ApiTestCollection : ICollectionFixture<OpenSchoolApiBroker>
                {}
            
            

            【讨论】:

              【解决方案9】:

              就我而言,我的Fixture 位于CollectionDefinition 中,而不是FixtureCollection

              例如:

              夹具代码

              public class MyFixture { ... }
              

              不工作

              [CollectionDefinition(nameof(MyFixture))]
              public class MyFixtureCollection : ICollection<MyFixture> {}
              

              工作

              [CollectionDefinition(nameof(MyFixtureCollection))]
              public class MyFixtureCollection : ICollection<MyFixture> {}
              

              【讨论】:

                猜你喜欢
                • 2019-11-07
                • 2020-11-02
                • 2018-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多