Pengujian Unit Metode Ekstensi UrlHelper

Saya mencoba membuat pengujian unit untuk memastikan metode ekstensi saya untuk UrlHelper berfungsi? Adakah yang tahu cara melakukan ini? Saya menggunakan MVC 1.0 dan MvcContrib. Saya dapat menguji rute tetapi tidak dapat menguji kode seperti ini:

    public static string MoreFloorplans(this UrlHelper urlHelper, long productID, int pageIndex)
    {
     return urlHelper.Action<CatalogController>(x => x.GetRelatedProducts(productID, pageIndex));

    }

person fregas    schedule 19.04.2010    source sumber


Jawaban (2)


Saya mengikuti instruksi dari Aaronaught dan Scott H tetapi perlu beberapa kali bermain-main. Saya berakhir dengan sesuatu seperti ini.

public UrlHelper GetUrlHelper(
        string fileName = "/",
        string url="http://localhost", 
        string queryString="")
{
    // Use routes from actual app
    var routeCollection = new RouteCollection();
    MvcApplication.RegisterRoutes(routeCollection);

    //Make a request context
    var request = new HttpRequest(fileName, url, queryString);
    var response = new HttpResponse(new StringWriter());
    var httpContext = new HttpContext(request, response);
    var httpContextBase = new HttpContextWrapper(httpContext);
    var requestContext = new RequestContext(httpContextBase, new RouteData());

    // Make the UrlHelper with empty route data
    return new UrlHelper(requestContext, routeCollection);
}

public void MoreFloorplans_ReturnsExpectedUrl()
{
    var urlHelper = GetUrlHelper();
    var actualResult = urlHelper.MoreFloorPlans(1,2);
    Assert.AreEqual("/MoreFloorPlans/1/2", actualResult);
}

Perhatikan bahwa Anda harus menguji metode ekstensi Anda, bukan UrlHelper itu sendiri, jadi menyiapkan RouteData di RequestContext mungkin di luar cakupan.

person Craig Celeste    schedule 23.07.2010

Untuk membuat UrlHelper, Anda memerlukan RequestContext. Untuk membuat RequestContext yang berfungsi, Anda memerlukan HttpContextBase dan RouteData. Yang kedua, RouteData, harus mudah dibuat. HttpContextBase, kamu harus mengejek.

Untuk itu, saya sarankan Anda melihat MvcMockHelpers milik Scott H. Sebagian darinya agak lama, tapi menurut saya cukup baik untuk pengujian khusus ini - yang Anda perlukan hanyalah metode FakeHttpContext dan dependensinya. Jika Anda mengambil perpustakaan itu, kode Anda akan terlihat seperti:

[TestMethod]
public void Can_write_more_floorplans()
{
    const long productID = 12345;
    const int pageIndex = 10;

    var httpContext = FakeHttpContext();  // From the MvcMockHelpers
    var routeData = new RouteData();
    var requestContext = new RequestContext(httpContext, routeData);
    var urlHelper = new UrlHelper(requestContext);
    string floorplans = MoreFloorplans(urlHelper, productID, pageIndex);
    Assert.AreEqual(some_string, floorplans);
}

Saya tahu Anda mengatakan Anda mencoba menggunakan proyek MvcContrib TestHelper, tetapi sejauh yang saya tahu, perpustakaan itu adalah tentang pengujian pengontrol. Saya tidak yakin apakah ini cukup terperinci untuk menguji komponen tingkat rendah. Lagipula Anda tidak terlalu membutuhkan semua barang di sana; yang Anda butuhkan hanyalah RequestContext.

person Aaronaught    schedule 19.04.2010