2017-01-25 1 views
5

Ich brauche eine Mock eine Methode in einer Basisklasse vorhanden, wenn eine Action-Methode in der Klasse Controller aufrufen.Wie mokiere ich eine Basismethode aus der Controller-Klasse mit dem Framework NSubstitute

Hier ist meine Controller-Klasse unten, ruft die Aktionsmethode Index() die Basismethode GetNameNodeStatus() auf. Nun, wie kann ich die GetNameNodeStatus() in der Basisklasse mokieren, wenn die Aktionsmethode Index ruft es mit den Nsubstitute Mocking Frameworks.

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(); 
     } 
    } 
} 

Hier ist meine Basisklasse Clustermonitoring

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

Und hier ist mein Test-Klasse

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' wird in der Methode manuell erstellt. Dies bedeutet, dass das Ersetzen nicht möglich ist. Sie müssen 'ClusterMonitoring' als Abhängigkeit vom Controller einfügen. – Nkosi

Antwort

1

ClusterMonitoring wird manuell in dem Verfahren erzeugt wird.

ClusterMonitoring monitoring = new ClusterMonitoring(); 

Das bedeutet, dass es nicht möglich ist zu ersetzen. Sie müssen ClusterMonitoring als Abhängigkeit zum Controller injizieren, um die Möglichkeit zu haben, sie beim Testen auszugeben.

erste abstrakte ClusterMonitoring hinter einer Schnittstelle

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

und haben es erben, die Schnittstelle

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

Update-Controller Abhängigkeit über Konstruktor nehmen

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); 
    } 
} 

Jetzt Test aktualisieren Abhängigkeit zu injizieren in Controller im Test

[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); 
    } 
} 
Verwandte Themen