为什么 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”功能在多个测试用例之间共享内容时遇到了问题。 (请参阅以下部分的详细信息)
测试环境
Windows 11 和 Visula Studio 2022 社区版
.NET 6 Web 应用程序“XunitDemo”与 .NET 6 Class 库“DataHelper”
套餐:
Xunit 2.4.2
Xunit.runner.visualstudio2.4.3
问题描述:
为了测试以下测试用例之间的共享内容,我用以下组件编写了测试代码
要测试的class:DataHelper.TextHelper(见代码段1)
测试项目:DataHelperTests
在测试项目中,创建了“fixture”对象TextHelperFixture(参见代码段 2)
在测试项目中,创建了 xunit CollectionDefinition(参见代码段 3)
为了确保 TextHelperFixture 正常工作,我设置了第一个测试用例:TextHelperFixtureTest(参见代码段 4)
为了测试多个测试用例之间的内容共享,我设置了 2 个单独的测试用例:CollectionDefTest1 & CollectionDefTest2具有 [Collection(....)] 属性。每个都有1个测试方法(见代码段5和6)
测试步骤:
为了验证“夹具”对象是否确实有效,我 运行 TextHelperFixtureTest 并且它顺利通过了。
为了测试“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
- 使用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
问题
“TextHelperFixtureTest”的测试结果表明,“Fixture”对象在测试用例中直接实例化时工作正常。为什么使用“CollectionDefinition”导致无法找到“Fixture”的错误class?
我认为 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]
,这是定义位的对应物...
(为了将来的读者把它放在长格式中 - 你显然已经对它进行了排序,但在这种情况下只是打字错误)
在开发 Web 应用程序时,我们经常需要对 class 库中的对象进行单元测试。我 运行 在尝试使用 Xunit“CollectionDefinition”功能在多个测试用例之间共享内容时遇到了问题。 (请参阅以下部分的详细信息)
测试环境
Windows 11 和 Visula Studio 2022 社区版
.NET 6 Web 应用程序“XunitDemo”与 .NET 6 Class 库“DataHelper”
套餐: Xunit 2.4.2 Xunit.runner.visualstudio2.4.3
问题描述:
为了测试以下测试用例之间的共享内容,我用以下组件编写了测试代码
要测试的class:DataHelper.TextHelper(见代码段1)
测试项目:DataHelperTests
在测试项目中,创建了“fixture”对象TextHelperFixture(参见代码段 2)
在测试项目中,创建了 xunit CollectionDefinition(参见代码段 3)
为了确保 TextHelperFixture 正常工作,我设置了第一个测试用例:TextHelperFixtureTest(参见代码段 4)
为了测试多个测试用例之间的内容共享,我设置了 2 个单独的测试用例:CollectionDefTest1 & CollectionDefTest2具有 [Collection(....)] 属性。每个都有1个测试方法(见代码段5和6)
测试步骤:
为了验证“夹具”对象是否确实有效,我 运行 TextHelperFixtureTest 并且它顺利通过了。
为了测试“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
- 使用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
问题
“TextHelperFixtureTest”的测试结果表明,“Fixture”对象在测试用例中直接实例化时工作正常。为什么使用“CollectionDefinition”导致无法找到“Fixture”的错误class?
我认为 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]
,这是定义位的对应物...
(为了将来的读者把它放在长格式中 - 你显然已经对它进行了排序,但在这种情况下只是打字错误)