2011-09-10 9 views
2

ASP.NET MVC 3NUnitを使用しています。文字列を返すときにURLヘルパーメソッドのテストが失敗する

Iは、(オーバーロードされたメソッド)として作用する方法を返すようにするヘルパーメソッドを作成した:

public static object CategoryIndex(this UrlHelper urlHelper) 
{ 
    return new { controller = "Category", action = "Index" }; 
} 

public static string CategoryIndex(this UrlHelper helper, int categoryId) 
{ 
    return helper.RouteUrl(new { controller = "Category", action = "Index", id = categoryId }); 
} 

失敗してテストがCategoryIndex_should_navigate_to_category_index_action_method_with_child_category_id()と呼ばれる第二の試験です。

private HttpContextBase httpContextBaseStub; 
private RequestContext requestContext; 
private UrlHelper urlHelper; 

[SetUp] 
public void SetUp() 
{ 
    httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>(); 
    requestContext = new RequestContext(httpContextBaseStub, new RouteData()); 
    urlHelper = new UrlHelper(requestContext); 
} 

[Test] 
public void CategoryIndex_should_navigate_to_category_index_action_method() 
{ 
    // Act 
    object actual = UrlHelperNavigationExtensions.CategoryIndex(urlHelper); 

    // Assert 
    RouteValueDictionary routes = new RouteValueDictionary(actual); 

    Assert.AreEqual("Category", routes["controller"]); 
    Assert.AreEqual("Index", routes["action"]); 
} 

[Test] 
public void CategoryIndex_should_navigate_to_category_index_action_method_with_child_category_id() 
{ 
    // Arrange 
    int childCategoryId = 1; 

    // Act 
    string actual = UrlHelperNavigationExtensions.CategoryIndex(urlHelper, childCategoryId); 

    // Assert 
    Assert.AreEqual("/Category/Index/1", actual); 
} 

実際にはnullであると訴えています。どうしてこのようになり、どうすればそれを修正するのだろうか?

+0

これに対してルーティングルールを投稿できますか? – Iridio

+0

@Iridio:新しいプロジェクトを追加するときのデフォルトルールがあります。 –

答えて

4

あなたはルーティングの初期化をしていないようです。私はそのようなトリックを行うだろうと思う

[SetUp] 
public void SetUp() 
{ 
    RouteCollection routes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routes); 

    httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>(); 
    requestContext = new RequestContext(httpContextBaseStub, new RouteData()); 

    //urlHelper = new UrlHelper(requestContext); 
    urlHelper = new UrlHelper(requestContext, routes); 
} 

それは、あなたは、HttpContextBaseを設定しないようです。それが適切に嘲笑されるようにしてください。そうしないとnull参照例外が発生します。

[SetUp] 
public void SetUp() 
{ 
    RouteCollection routes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routes); 

    //httpContextBaseStub = (new Moq.Mock<HttpContextBase>()).Object; 

    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns((String url) => url); 
    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Setup(c => c.Request).Returns(request.Object); 
    mockHttpContext.Setup(c => c.Response).Returns(response.Object); 
    requestContext = new RequestContext(mockHttpContext.Object, new RouteData()); 

    urlHelper = new UrlHelper(requestContext, routes); 
} 
+0

+1はすぐに徹底的に! –

1

私の推測は、ルートテーブルが空であるため、URLを生成する方法がわからないからです。

通常の/ {controller}/{action}ルートを追加すると正常に動作します。

(私は電話でよ、これが間違っている場合は許し)

あなたは、私がここにstub_handler呼んでいるIRouteHandlerの実装を、スタブする必要があります。

RouteTable.Routes.Add(new Route 
(
    "{controller}/{action}/{id}" 
    , stub_handler 
); 
+0

+1:私は同じと思っていた – Iridio

+0

@Andras:いくつかのコードを教えてください。 –

+0

@Brendanが更新されました。あなたはIRouteHandlerインターフェイスをもっとスタブしなくてはなりません。 –

関連する問題