Frage

Ich versuche, einen HTML -Helfer mit Autofixure zu testen. Unten ist meine 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));
}

Wie Sie sehen können, gibt es nur eine MVC -HTML -Zeichenfolge mit Tabellen -Tags und ID zurück. (Siehe unten ein Beispiel für ein Beispiel)

Einheitstest mit Autofixure:

[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 und fakeViewDatacontainer sind nur die gefälschten Implementierungen von httpcontextbase und iviewDatacontainer.

Dieser Test erfolgt und gibt das erwartete Ergebnis zurück. Ich bin mir jedoch nicht sicher, ob ich die Autofixe hier richtig verwende. Gibt es eine bessere Möglichkeit, die Autofixure innerhalb dieses Einheitstests zu verwenden?

War es hilfreich?

Lösung

Basierend auf Teilinformationen ist es schwer zu erkennen, wie der obige Test weiter reduziert werden kann, aber ich würde vermuten, dass er reduziert werden könnte.

Zunächst die Kombination des Aufrufens Inject gefolgt von CreateAnonymous ist eher idiomatisch - besonders wenn Sie die Sequenz umkehren. Das nennt man Einfrieren der anonyme Wert (und entspricht dem Singleton -Lebensbereich eines DI -Containers). Es kann prägnanter wie folgt angegeben werden:

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

Es scheint auch so, als ob der Test httpcontext auf fakeHttpcontext zuordnen. Die Zuordnung kann ein bisschen einfacher gemacht werden, Aber das werden transiente Instanzen zugeordnet ...

In jedem Fall, es sei denn, Sie haben überzeugende Gründe für die Verwendung Handbuch Mocks anstelle einer dynamischen Scheinbibliothek, Sie können sich genauso gut entscheiden, sich zu verwenden Autofixe als automatischem Behälter. Das könnte Sie von vielen dieser Typ -Mapping befreien.

Also, angesichts dessen würde ich erraten damit Sie den Test auf so etwas reduzieren können:

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

Der größte Teil des Anordnungsteils ist jetzt rein deklarativ, und da Sie anscheinend bereits Xunit.net verwenden, können Sie verwenden Autodata -Theorien zur Autofixe Um die meisten Variablen auf Methodenargumente zu verschieben:

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

Dies setzt voraus, dass Sie die Automoqcustomisierung mit der Autodatattribute wie folgt überbrückt haben:

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

Bitte beachten Sie, dass Sie möglicherweise den obigen Code ein wenig optimieren müssen, damit er die Details Ihrer API entspricht. Dies ist nur als Skizze gedacht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top