【问题标题】:AutoFixture and the Create methodAutoFixture 和 Create 方法
【发布时间】:2014-02-15 12:15:04
【问题描述】:

我已经使用 AutoFixture 几个星期了,我想知道是为我想要创建的每个对象使用一个新的 Fixture,还是可以重复使用我自定义的 Fixture?

这里有几种不同的方法。

重复使用相同的夹具。

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 Fixture().Create<ExportModelStateToTempDataAttribute>();

使用新关键字创建 SUT。

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);
}

【问题讨论】:

    标签: c# unit-testing fixtures autofixture


    【解决方案1】:

    AutoFixture 的惯用用法是每个测试方法使用Fixture 类的共享实例。

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


    事实上,您可以利用AutoFixture.Xunit 胶水库:

    PM> Install-Package 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()))
        {
        }
    }
    

    【讨论】:

    • 谢谢!是的,我是这么想的。我已经将 AutoDataAttribute 用于各种事情,但我喜欢在测试方法中声明大部分事情。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多