Tests unitaires d'Aide Html avec AutoFixture
-
27-10-2019 - |
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?
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.