2014-02-15 3 views
1

Я использую AutoFixture в течение нескольких недель, и мне интересно, лучше ли использовать новый Fixture для каждого объекта, который я хочу создать, или я могу просто повторно использовать приспособление, которое я настроил?AutoFixture и метод Create

Вот несколько разных подходов.

Повторное использование такого же приспособления.

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

ответ

3

идиоматичен использование 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())) 
    { 
    } 
} 
+0

Спасибо! да, я так и думал. Я уже использую AutoDataAttribute для разных вещей, но мне нравится объявлять большинство вещей внутри метода тестирования. :) –

Смежные вопросы