AutoFixture 和 XUnit2 - 结合 TheoryData 和 AutoData
AutoFixture and XUnit2 - Combining TheoryData and AutoData
在我目前正在编写的测试中,我需要将特定于测试的数据与理想情况下我希望 AutoFixture 生成的随机条目混合。
我正在使用 TheoryData 创建特定于测试的数据集:
internal sealed class TestSpecificData : TheoryData<int, string>
{
// Addition of test cases input.
}
在我的 XUnit2 测试用例中,我想执行以下操作:
[Theory]
[AutoData]
[ClassData(TestSpecificData)]
public void MyTestCase(int first, string second, double third)
{
// Test scenario.
}
在上面的测试用例中,我希望 AutoFixture 只生成最后一个参数:“double third”,并使用 TestSpecificData 理论数据中可用的数据作为前两个参数。
尝试 运行 上面的代码会导致 InvalidOperationException 并显示以下消息:
"The test method expected 3 parameter values, but 2 parameter values were provided."
我知道我可以使用 InlineAutoData 属性,但是有很多特定于测试的条目,这不是一个理想的解决方案,因为我必须为每种情况声明一个单独的 InlineAutoData。此外,我想在不同的测试用例中重用测试条目,所以这就是我尝试使用 TheoryData 的原因。
我还尝试创建一个从 AutoDataAttribute 继承的自定义 AutoFixture 属性,但我似乎无法让它像我希望的那样工作。
我将不胜感激任何有助于我实现预期结果的建议或不同的解决方案。
谢谢!
遗憾的是,AutoFixture.XUnit2
目前不支持 ClassDataAttribute
。然而,目前有一个 pull request 打开,将这个确切的功能添加到 AutoFixture.NUnit3
。你可以从那里得到一些灵感。
如果您设法想出一个实现,请考虑在官方 AutoFixture 存储库上提交拉取请求。
找这个的时候发现
a workaround for MemberAutoDataAttribute。稍作修改(将 MemberDataAttribute
替换为 ClassDataAttribute
),我们就可以使用了。
要创建具有自定义的属性,然后我从 ClassDataAttribute
派生,例如:
public class MyTypeClassAutoMoqDataAttribute : ClassAutoDataAttribute
{
public MyTypeClassAutoMoqDataAttribute(Type @class)
: base(@class,
() => new Fixture()
.Customize(new AutoMoqCustomization())
.Customize(new MyTypeCustomization()))
{
}
}
在我目前正在编写的测试中,我需要将特定于测试的数据与理想情况下我希望 AutoFixture 生成的随机条目混合。 我正在使用 TheoryData 创建特定于测试的数据集:
internal sealed class TestSpecificData : TheoryData<int, string>
{
// Addition of test cases input.
}
在我的 XUnit2 测试用例中,我想执行以下操作:
[Theory]
[AutoData]
[ClassData(TestSpecificData)]
public void MyTestCase(int first, string second, double third)
{
// Test scenario.
}
在上面的测试用例中,我希望 AutoFixture 只生成最后一个参数:“double third”,并使用 TestSpecificData 理论数据中可用的数据作为前两个参数。 尝试 运行 上面的代码会导致 InvalidOperationException 并显示以下消息:
"The test method expected 3 parameter values, but 2 parameter values were provided."
我知道我可以使用 InlineAutoData 属性,但是有很多特定于测试的条目,这不是一个理想的解决方案,因为我必须为每种情况声明一个单独的 InlineAutoData。此外,我想在不同的测试用例中重用测试条目,所以这就是我尝试使用 TheoryData 的原因。 我还尝试创建一个从 AutoDataAttribute 继承的自定义 AutoFixture 属性,但我似乎无法让它像我希望的那样工作。 我将不胜感激任何有助于我实现预期结果的建议或不同的解决方案。
谢谢!
遗憾的是,AutoFixture.XUnit2
目前不支持 ClassDataAttribute
。然而,目前有一个 pull request 打开,将这个确切的功能添加到 AutoFixture.NUnit3
。你可以从那里得到一些灵感。
如果您设法想出一个实现,请考虑在官方 AutoFixture 存储库上提交拉取请求。
找这个的时候发现
a workaround for MemberAutoDataAttribute。稍作修改(将 MemberDataAttribute
替换为 ClassDataAttribute
),我们就可以使用了。
要创建具有自定义的属性,然后我从 ClassDataAttribute
派生,例如:
public class MyTypeClassAutoMoqDataAttribute : ClassAutoDataAttribute
{
public MyTypeClassAutoMoqDataAttribute(Type @class)
: base(@class,
() => new Fixture()
.Customize(new AutoMoqCustomization())
.Customize(new MyTypeCustomization()))
{
}
}