Question

Je tente à l'unité de test d'Aide à l'aide Html AutoFixture. Ci-dessous mon SUT

public static MvcHtmlString SampleTable(this HtmlHelper helper,
    SampleModel model, IDictionary<string, object> htmlAttributes)
{
    if (helper == null)
    {
        throw new ArgumentNullException("helper");
    }
    if (model == null)
    {
        throw new ArgumentNullException("model");
    }

    TagBuilder tagBuilder = new TagBuilder("table");
    tagBuilder.MergeAttributes(htmlAttributes);
    tagBuilder.GenerateId(helper.ViewContext.HttpContext.Items[Keys.SomeKey].ToString());
    return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}

Comme vous pouvez le voir retourne juste une chaîne MVC Html avec des étiquettes de table et Id attachés. (Voir ci-dessous Résultat du test unitaire pour un exemple)

test unitaire avec AutoFixture:

[Fact]
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml()
{
    var fixture = new Fixture();

    //Arrange
    fixture.Inject<HttpContextBase>(new FakeHttpContext());
    var httpContext = fixture.CreateAnonymous<HttpContextBase>();
    fixture.Inject<ViewContext>(new ViewContext());
    var vc = fixture.CreateAnonymous<ViewContext>();

    vc.HttpContext = httpContext;
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo");

    fixture.Inject<IViewDataContainer>(new FakeViewDataContainer());
    var htmlHelper = fixture.CreateAnonymous<HtmlHelper>();
    var sampleModel = fixture.CreateAnonymous<SampleModel>();

    //Act
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString();

    //Assert
    Assert.Equal("<table id=\"foo\"></table>", result);
}      

FakeHttpContext et FakeViewDataContainer ne sont que les implémentations de faux de HttpContextBase et IViewDataContainer.

Ce test passe et renvoie le résultat attendu. Cependant, m » Je ne sais pas j'utiliser correctement le Autofixture ici. Y at-il une meilleure façon d'utiliser AutoFixture dans ce test unitaire?

Était-ce utile?

La solution

Sur la base des informations partielles, il est difficile de dire exactement comment le test ci-dessus pourrait encore être réduit, mais je suppose que cela pourrait être réduit.

Tout d'abord, le combo d'invoquer Inject suivie CreateAnonymous est plutôt idiomatiques - en particulier si vous inversez la séquence. Ceci est appelé congélation la valeur anonyme (et équivaut à un conteneur de DI de Singleton portée à vie). On peut dire plus succinctement comme ceci:

var vc = fixture.Freeze<ViewContext>();

Il semble aussi que si le test est la cartographie HttpContext à FakeHttpContext. Mapping peut être fait un peu plus facile , mais se associeront transitoire cas ...

Dans tous les cas, à moins que vous avez des raisons impérieuses d'utiliser Manuel Mocks au lieu d'un dynamique bibliothèque Mock , vous pourriez aussi bien décider d'utiliser AutoFixture comme une auto -mocking récipient . Cela pourrait vous débarrasser de beaucoup de ce mappage de type.

Alors, étant donné tout ce qui, je guess que vous pourriez être en mesure de réduire le test à quelque chose comme ceci:

[Fact]
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());

    //Arrange
    var vc = fixture.Freeze<ViewContext>();
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo");

    var htmlHelper = fixture.CreateAnonymous<HtmlHelper>();
    var sampleModel = fixture.CreateAnonymous<SampleModel>();

    //Act
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString();

    //Assert
    Assert.Equal("<table id=\"foo\"></table>", result);
}

Cependant, la plupart de la partie Arranger est maintenant purement déclarative, et puisque vous semblez déjà utiliser xUnit.net, vous pouvez utiliser Autodata théories pour AutoFixture pour déplacer la plupart des variables aux arguments de la méthode:

[Theory, AutoMoqData]
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml(
    [Frozen]ViewContext vc,
    HtmlHelper htmlHelper,
    SampleModel sampleModel)
{
    //Arrange
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo");

    //Act
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString();

    //Assert
    Assert.Equal("<table id=\"foo\"></table>", result);
}

Cela suppose que vous avez comblé le AutoMoqCustomization avec le AutoDataAttribute comme ceci:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute :
        base(new Fixture().Customize(new AutoMoqCustomization()))
    { }
}

S'il vous plaît garder à l'esprit que vous devrez peut-être modifier le code ci-dessus un peu pour l'adapter les détails de votre API. Ce n'est conçu comme un croquis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top