2017-07-10 14 views
2

私は2つのプロジェクトを含むソリューションを作成しています:Webプロジェクトとテストプロジェクトです。私は依存性注入とテストのためのMOQのためのログ記録の目的のためにlog4netのCastleWindsorを使用しています。MVC WebソリューションのLog4Net

問題は、テストの構成です。 HomeControllerをファイルにロギングしてテストしたいのですが、テストを実行するときにログに記録したくないと思います。

テストプロジェクトのログをスキップする方法はありますか?

にHomeControllerクラス:答えはテストのためにlog4netのを実装するための最良の方法である、ノーであれば

[TestClass] 
public class HomeControllerTest 
{ 
    private static WindsorContainer _container; 

    [ClassInitialize()] 
    public static void InstallWindsor() 
    { 
     _container = new WindsorContainer(); 
     // configure other classes 
    } 

    [ClassCleanup()] 
    public static void DisposeContainer() 
    { 
     _container.Dispose(); 
    } 

    [TestMethod] 
    public void Index() 
    { 
     // Disponer 
     var mock = new Mock<IRowan>(); 

     mock.Setup(m => m.DoSomething()).Returns("Home Page"); 

     HomeController controller = new HomeController(mock.Object); 

     // Actuar 
     ViewResult result = controller.Index() as ViewResult; 

     // Declarar 
     Assert.IsNotNull(result); 
     Assert.AreEqual("Home Page", result.ViewBag.Title); 
    } 
} 

public class HomeController : Controller 
{ 
    // this is Castle.Core.Logging.ILogger, not log4net.Core.ILogger 
    public ILogger Logger { get; set; } 

    private IRowan _rowan; 

    public HomeController(IRowan rowan) 
    { 
     _rowan = rowan; 

    } 

    public ActionResult Index() 
    { 
     //In the [tests] Logger fails 
     Logger.Debug("GET Request traced"); 
     Logger.Error("Example of Error"); 


     String test = _rowan.DoSomething(); 
     ViewBag.Title = test; 
     return View(); 
    } 
} 

}

にそれはテストですか?

PD:コードを実行すると、正常に動作します。テストを実行すると、nullであるため、Loggerは例外をスローします。

PD:私はMicrosoft Technologyを使い始めています。

+0

ちょうどそれをクリアするには、ロガーを注入する依存関係もありますか?これは通常、あなたが気にしないことの1つです - [例えばこれを参照](https://stackoverflow.com/questions/12591955/should-logging-infrastructure-be-injected-when-using-ioc-di-if -logging-facade-is)です。そうすれば、ロガーがそのように構成されないため、テスト中にログに記録することはありません。 –

+0

ロガーはNuggetパッケージ** Castle.Windsor-log4net **を使用して注入され、[このチュートリアル](https://github.com/castleproject/Windsor/blob/master/docs/mvc-tutorial-part)に従います--adding-logging-support.md)を使用して設定します。 – albert

答えて

2

あなたのロガーを模擬し、そのようなあなたのコントローラ上で設定できます。あなたが本当にあなたのテストでCastleWindsorを使用する必要はありません

Mock<ILogger> mockLogger = new Mock<ILogger>(); 
controller.Logger = mockLogger.Object; 

注意。これは、アプリケーション内のオブジェクトのライフサイクルを制御するのに便利ですが、テストでは手動で物事を注入する必要があります。あなたは実際に上記の例でこれを実行しています。投稿したコードから、ClassInitialize関数とClassCleanup関数を削除することができます。

+0

良いソリューションです。これは、テストを実行中にログを書き込まないため、テストプロジェクトでLog4netを設定する必要はありません – albert

関連する問題