C# AutoFixture及其创建方法

C# AutoFixture及其创建方法,c#,unit-testing,fixtures,autofixture,C#,Unit Testing,Fixtures,Autofixture,我现在使用AutoFixture已经有几个星期了,我想知道是为我想要创建的每个对象使用一个新的夹具更好,还是可以重用我定制的夹具更好 这里有几种不同的方法 重复使用相同的夹具。 Fixture fixture = new Fixture(); ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))

我现在使用AutoFixture已经有几个星期了,我想知道是为我想要创建的每个对象使用一个新的夹具更好,还是可以重用我定制的夹具更好

这里有几种不同的方法

重复使用相同的夹具。

Fixture fixture = new Fixture();

ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                       .Customize(new CustomController())
                                       .Customize(new CustomActionExecutedContext())
                                       .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = fixture.Create<ExportModelStateToTempDataAttribute>();
ActionExecutedContext context = new Fixture().Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                                             .Customize(new CustomController())
                                                             .Customize(new CustomActionExecutedContext())
                                                             .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();
[Fact]
public void Should_not_set_the_temp_data_when_the_model_is_valid()
{
    // Arrange
    Fixture fixture = new Fixture();

    ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                           .Customize(new CustomController())
                                           .Customize(new CustomActionExecutedContext())
                                           .Create<ActionExecutedContext>();

    ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();

    // Act
    attribute.OnActionExecuted(context);

    // Assert
    context.Controller.TempData.Should().HaveCount(0);
}
Fixture Fixture=新夹具();
ActionExecuteContext上下文=fixture.Customize(新的CustomActionResult(“控制器/动作”))
.Customize(新的CustomController())
.Customize(新建CustomActionExecutedContext())
.Create();
ExportModelStateToTempDataAttribute属性=fixture.Create();
为每个对象创建一个新的装置。(我不确定这是否有意义,因为我看不出有什么理由这么做。)

ActionExecuteContext context=new Fixture().Customize(新的CustomActionResult(“控制器/动作”))
.Customize(新的CustomController())
.Customize(新建CustomActionExecutedContext())
.Create();
ExportModelStateToTempDataAttribute属性=新装置().Create();
使用新关键字创建SUT。

Fixture fixture = new Fixture();

ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                       .Customize(new CustomController())
                                       .Customize(new CustomActionExecutedContext())
                                       .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = fixture.Create<ExportModelStateToTempDataAttribute>();
ActionExecutedContext context = new Fixture().Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                                             .Customize(new CustomController())
                                                             .Customize(new CustomActionExecutedContext())
                                                             .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();
[Fact]
public void Should_not_set_the_temp_data_when_the_model_is_valid()
{
    // Arrange
    Fixture fixture = new Fixture();

    ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                           .Customize(new CustomController())
                                           .Customize(new CustomActionExecutedContext())
                                           .Create<ActionExecutedContext>();

    ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();

    // Act
    attribute.OnActionExecuted(context);

    // Assert
    context.Controller.TempData.Should().HaveCount(0);
}
ActionExecuteContext context=new Fixture().Customize(新的CustomActionResult(“控制器/动作”))
.Customize(新的CustomController())
.Customize(新建CustomActionExecutedContext())
.Create();
ExportModelStateToTempDataAttribute=新的ExportModelStateToTempDataAttribute();
这是完整的测试。

Fixture fixture = new Fixture();

ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                       .Customize(new CustomController())
                                       .Customize(new CustomActionExecutedContext())
                                       .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = fixture.Create<ExportModelStateToTempDataAttribute>();
ActionExecutedContext context = new Fixture().Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                                             .Customize(new CustomController())
                                                             .Customize(new CustomActionExecutedContext())
                                                             .Create<ActionExecutedContext>();

ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();
[Fact]
public void Should_not_set_the_temp_data_when_the_model_is_valid()
{
    // Arrange
    Fixture fixture = new Fixture();

    ActionExecutedContext context = fixture.Customize(new CustomActionResult<RedirectResult>("Controller/Action"))
                                           .Customize(new CustomController())
                                           .Customize(new CustomActionExecutedContext())
                                           .Create<ActionExecutedContext>();

    ExportModelStateToTempDataAttribute attribute = new ExportModelStateToTempDataAttribute();

    // Act
    attribute.OnActionExecuted(context);

    // Assert
    context.Controller.TempData.Should().HaveCount(0);
}
[事实]
当模型有效时,public void不应设置临时数据
{
//安排
夹具=新夹具();
ActionExecuteContext上下文=fixture.Customize(新的CustomActionResult(“控制器/动作”))
.Customize(新的CustomController())
.Customize(新建CustomActionExecutedContext())
.Create();
ExportModelStateToTempDataAttribute=新的ExportModelStateToTempDataAttribute();
//表演
OnActionExecuted(上下文);
//断言
context.Controller.TempData.Should().HaveCount(0);
}
AutoFixture的惯用用法是使用每个测试方法的
Fixture
类的共享实例

因此,虽然所有的示例在技术上都是正确的,但最后一个示例更为惯用,因为它不使用任何共享状态


事实上,您可以利用glue库:


PM>安装包AutoFixture.Xunit

虽然我还没有尝试编译这个,但示例测试可以重写为:

[Theory, TestConventions]
public void Should_not_set_the_temp_data_when_the_model_is_valid(
    ActionExecutedContext context,
    ExportModelStateToTempDataAttribute attribute)
{
    attribute.OnActionExecuted(context);
    context.Controller.TempData.Should().HaveCount(0);
}
其中,
TestConventions
定义为:

internal class TestConventionsAttribute : AutoDataAttribute
{
    internal TestConventionsAttribute() 
        : base(
            new Fixture()
                .Customize(new CustomActionResult<RedirectResult>(
                               "Controller/Action"))
                .Customize(new CustomController())
                .Customize(new CustomActionExecutedContext()))
    {
    }
}
内部类TestConventionsAttribute:AutoDataAttribute
{
内部测试约定属性()
:基本(
新夹具()
.Customize(新CustomActionResult)(
“控制员/行动”))
.Customize(新的CustomController())
.Customize(新建CustomActionExecutedContext())
{
}
}

谢谢!是的,我想是的。我已经在为各种事情使用AutoDataAttribute,但我喜欢在测试方法中声明大多数事情。:)