2017-01-25 7 views
5

ControllerクラスのActionメソッドが呼び出すときに、ベースクラスにメソッドが存在することが必要です。NSubstitueフレームワークを使用してControllerクラスからベースメソッドをモックする方法

以下は私のコントローラクラスです。アクションメソッドIndex()は、基本メソッドGetNameNodeStatus()を呼び出します。では、というアクションメソッドがNsubstitute mockingフレームワークを使用して呼び出すとき、基本クラスにあるGetNameNodeStatus()をどのようにモックできますか?ここで

using Cluster.Manager.Helper; 
using Cluster.Manager.Messages; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 

namespace Cluster.Manager 
{ 
    public class HomeController : Controller 
    { 
     // GET: Home 
     public ActionResult Index() 
     { 
      ClusterMonitoring monitoring = new ClusterMonitoring(); 
      string getStatus = monitoring.GetNameNodeStatus("", new Credential()); 
      return View(); 
     } 
    } 
} 

は私の基本クラスはClustermonitoring

namespace Cluster.Manager.Helper 
{ 
    public class ClusterMonitoring 
    { 
     public virtual string GetNameNodeStatus(string hostName, Credential credential) 
     { 
      return "Method Not Implemented"; 
     } 
    } 
} 

されており、ここに私のテストクラス

namespace NSubstituteControllerSupport 
{ 
    [TestFixture] 
    public class UnitTest1 
    { 

     [Test] 
     public void ValidateNameNodeStatus() 
     { 
      var validation = Substitute.ForPartsOf<ClusterMonitoring>(); 
      validation.When(actionMethod => actionMethod.GetNameNodeStatus(Arg.Any<string>(), Arg.Any<Credential>())).DoNotCallBase(); 
      validation.GetNameNodeStatus("ipaddress", new Credential()).Returns("active"); 
      var controllers = Substitute.For<HomeController>(); 
      controllers.Index(); 
     } 
    } 
} 
+0

メソッドでClusterMonitoringが手動で作成されています。つまり、それを置換することはできません。コントローラに依存関係として 'ClusterMonitoring'を注入する必要があります。 – Nkosi

答えて

1

ClusterMonitoringを手動方式で作成されています。

ClusterMonitoring monitoring = new ClusterMonitoring(); 

これは、これを置き換えることができないことを意味します。あなたはコントローラに依存するものとしてClusterMonitoringを注入する必要があります。これは、テスト時にそれを置換する能力を持つためです。

まず抽象インタフェース

public interface IClusterMonitoring { 
    string GetNameNodeStatus(string hostName, Credential credential); 
} 

背後ClusterMonitoring、それはそのインターフェイスに

public class HomeController : Controller { 
    private readonly IClusterMonitoring monitoring; 

    public HomeController(IClusterMonitoring monitoring) { 
     this.monitoring = monitoring; 
    } 

    // GET: Home 
    public ActionResult Index() { 
     var status = monitoring.GetNameNodeStatus("", new Credential()); 
     return View(status); 
    } 
} 

今すぐ依存関係を注入するためのテストを更新

コンストラクタを介して依存性を取るために

public class ClusterMonitoring : IClusterMonitoring { 
    public virtual string GetNameNodeStatus(string hostName, Credential credential) { ... } 
} 

更新コントローラを継承しています試験中のコントローラへ

[TestFixture] 
public class UnitTest1 { 

    [Test] 
    public void ValidateNameNodeStatus() { 
     //Arrange 
     var expected = "active"; 
     var validation = Substitute.For<IClusterMonitoring>(); 
     validation.GetNameNodeStatus("", new Credential()).Returns(expected); 
     var controller = new HomeController(validation); 

     //Act 
     var actual = controllers.Index() as ViewResult; 

     //Assert 
     Assert.IsNotNull(actual); 
     Assert.AreEqual(expected, actual.Model); 
    } 
} 
関連する問題