为什么 Xunit CollectionDefinition 不能与 .NET 6 Web App 中的 Class 库一起使用?

Why the Xunit CollectionDefinition Not Working with Class Library in .NET 6 Web App?

在开发 Web 应用程序时,我们经常需要对 class 库中的对象进行单元测试。我 运行 在尝试使用 Xunit“CollectionDefinition”功能在多个测试用例之间共享内容时遇到了问题。 (请参阅以下部分的详细信息)

测试环境

问题描述:

为了测试以下测试用例之间的共享内容,我用以下组件编写了测试代码

  1. 要测试的class:DataHelper.TextHelper(见代码段1)

  2. 测试项目:DataHelperTests

  3. 在测试项目中,创建了“fixture”对象TextHelperFixture(参见代码段 2)

  4. 在测试项目中,创建了 xunit CollectionDefinition(参见代码段 3)

  5. 为了确保 TextHelperFixture 正常工作,我设置了第一个测试用例:TextHelperFixtureTest(参见代码段 4)

  6. 为了测试多个测试用例之间的内容共享,我设置了 2 个单独的测试用例:CollectionDefTest1 & CollectionDefTest2具有 [Collection(....)] 属性。每个都有1个测试方法(见代码段5和6)

测试步骤:

  1. 为了验证“夹具”对象是否确实有效,我 运行 TextHelperFixtureTest 并且它顺利通过了。

  2. 为了测试“CollectionDefinition”,我尝试执行第一个测试方法:CollectDefTest1.CollDefTest1。它因以下错误而失败:

 DataHelperTests.CollectionDefTest1.CollDefTest1
 Source: CollectionDefTest1.cs line 15
 Duration:1 ms

  Message: The following constructor parameters did not have matching fixture data: TextHelperFixture fixture
  1. 使用CollectionDefTest2.CollDefTest2进行第二次测试时运行出现类似的错误:
 DataHelperTests.CollectionDefTest2.CollDefTest1
 Source: CollectionDefTest2.cs line 16
 Duration: 1 ms

 Message: The following constructor parameters did not have matching fixture data: TextHelperFixture thFixture

问题

  1. “TextHelperFixtureTest”的测试结果表明,“Fixture”对象在测试用例中直接实例化时工作正常。为什么使用“CollectionDefinition”导致无法找到“Fixture”的错误class?

  2. 我认为 CollectionDefinition 可能无法与 class 库一起使用。我实际上使用 class 库设置了一个控制台应用程序,“CollectionDefinition”在那里运行良好。为什么主项目是 .NET 6 web 应用程序时会出现此问题?

如果有人有任何建议和故障排除技巧,我们将不胜感激。

测试代码段

------ 代码段 1: Class in library to be Tested ------

namespace DataHelper
{
    public class TextHelper
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }

        public TextHelper() { }

        public TextHelper (string fn, string ln)
        {
            FirstName = fn;
            LastName = ln;
        }

        public string GetFullName()
        {
            return $"{FirstName} {LastName}";
        }
    }
}

------ 代码段 2:测试项目中的“Fixture”对象 ------

using System;

namespace DataHelperTests
{
    public class TextHelperFixture: IDisposable
    {
        public string FullName { get; private set; }

        public TextHelperFixture()
        {
            TextHelper st = new TextHelper("Jason", "Williams");
            FullName = st.GetFullName();
        }

        public void Dispose()
        {

        }
    }
}

------ 代码段 3:测试项目中的 CollectionDefinition ------

using Xunit;

namespace DataHelperTests
{
    [Collection("TextHelper Collection")]
    public class TextHelperFixtureCollection : ICollectionFixture<TextHelperFixture> { }
}

------ 代码段 4:验证“fixture”对象的测试用例 ------

using Xunit;

namespace DataHelperTests
{
    public class TextHelperFixtureTest
    {
        private TextHelperFixture _fxt;
        public TextHelperFixtureTest()
        {
            _fxt = new TextHelperFixture();
        }

        [Fact]
        public void FixtureTest()
        {
            Assert.NotNull(_fxt.FullName);
        }
    }
}

------ 代码段 5:第一个测试利用集合 ------

using Xunit;

namespace DataHelperTests
{
    [Collection("TextHelper Collection")]
    public class CollectionDefTest1
    {
        private TextHelperFixture _fixture;
        public CollectionDefTest1(TextHelperFixture fixture)
        {
            _fixture = fixture;
        }

        [Fact]
        public void CollDefTest1()
        {
            string result = _fixture.FullName;
            Assert.Contains("Jason", result);
        }
    }
}

------ 代码段 6:利用集合的第二个测试用例 ------

using Xunit;

namespace DataHelperTests
{
    [Collection("TextHelper Collection")]
    public class CollectionDefTest2
    {
        private TextHelperFixture _fixture;
            
        public CollectionDefTest2(TextHelperFixture thFixture)
        {
            _fixture = thFixture;
        }

        [Fact]
        public void CollDefTest1()
        {
            Assert.NotNull(_fixture.FullName);
        }
    }
}

你已经完美地完成了 99%(当有人回答一个问题时,很高兴有人显然花时间尽可能多地以教科书的方式浮出水面) - 只是 typo/mistake下

Code Segment 3: CollectionDefinition in Test project

您正在使用 [Collection] 属性,就像在测试 Class 中正确使用的一样,但您的意思是 [CollectionDefinition],这是定义位的对应物...

(为了将来的读者把它放在长格式中 - 你显然已经对它进行了排序,但在这种情况下只是打字错误)