2016-11-12 11 views
2

私はAsp.net mvc Webアプリケーションを開発しています。私は私のアプリケーションにユニットテストをしています。私はオブジェクトを模擬するためにMoqを使用しています。私はUrlヘルパークラスを模擬しようとしています。私はこのリンクを見つけました - asp.net mvc: how to mock Url.Content("~")?。そのクラスを使って、ユニットテストでUrlHelperクラスを模擬することができます。Asp.net mvcでUrlHelperクラスがnull例外をスローする

私はここBaseController

このよう
public class BaseController : Controller 
{ 
    private IUrlHelper _urlHelper; 

    public new IUrlHelper Url 
    { 
     get { return _urlHelper; } 
     set { _urlHelper = value; } 
    } 
} 

を作成IUrlHelperインタフェース/抽象化は、私はこの

Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>(); 
urlHelperMock 
    .Setup(x => x.Content(It.IsAny<string>())) 
    .Returns<string>(x => "~/" + x);// Mock Content method of Url Helper 

テストランのようなユニットテストでUrl.Content()をモック

public interface IUrlHelper 
{ 
    string Action(string actionName); 
    string Action(string actionName, object routeValues); 
    string Action(string actionName, string controllerName); 
    string Action(string actionName, RouteValueDictionary routeValues); 
    string Action(string actionName, string controllerName, object routeValues); 
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues); 
    string Action(string actionName, string controllerName, object routeValues, string protocol); 
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName); 
    string Content(string contentPath); 
    string Encode(string url); 
    string RouteUrl(object routeValues); 
    string RouteUrl(string routeName); 
    string RouteUrl(RouteValueDictionary routeValues); 
    string RouteUrl(string routeName, object routeValues); 
    string RouteUrl(string routeName, RouteValueDictionary routeValues); 
    string RouteUrl(string routeName, object routeValues, string protocol); 
    string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName); 
} 

あります正常に動作し、正常に動作します。問題は、リアルタイムアプリケーションでは使用できないということです。私は私のアプリケーションを実行し、Url.Content( "パス")を呼び出すとき、それはヌル例外をスローすることを意味します。このコードで

例えば

public class ExampleController : BaseController 
{ 
    public string GetPath() 
    { 
     return Url.Content("~/Path/To/File"); 
    } 
} 

Url.Contentヌル例外をスローします。ユニットテストでうまくいきます。コードを修正するにはどうしたらいいですか?

+0

この例では、テストのためにインターフェイスを模倣する方法を示していますが、実動コードの実装方法は示していません。実際の実装は行われていないため、ライブ実行ではnullになる可能性はありません。 – Nkosi

答えて

2

この場合、実際にはUrlHelperを要約する必要はありません。必要な作業を行うために、テストのためにヘルパーを援助してください。例えば、ここ

public class ExampleController : Controller { 
    public string GetContent() { 
     return Url.Content("~/Path/To/File"); 
    } 
} 

を仮定は、だから今試験が行われ、またフレームワークすることができるだけで元の例のよう

[TestClass] 
public class UrlHelperTest { 
    [TestMethod] 
    public void MockUrlHelper() { 
     //Arrange    
     var expectedPath = "~/Path/To/File"; 
     var expectedContent = "<p>Fake content here<p>"; 
     var urlHelperMock = new Mock<UrlHelper>(); 
     urlHelperMock 
      .Setup(m => m.Content(expectedPath)) 
      .Returns(expectedContent) 
      .Verifiable(); 

     var sut = new ExampleController(); 
     sut.Url = urlHelperMock.Object; //Set mock UrlHelper   

     //Act 
     var actualContent = sut.GetContent(); 

     //Assert 
     urlHelperMock.Verify(); 
     Assert.AreEqual(expectedContent, actualContent); 
    } 
} 

を動作するように関連キーワードを使用してUrlHelperをモックテスト

あります技術的には元のフレームワークからカスタム抽象化に変更されていないため、プロダクションで必要なコントローラプロパティが設定されます。

関連する問題