2017-01-25 3 views
5

Мне нужен mock метод, присутствующий в базовом классе, когда метод Action в классе Controller вызывает его.Как я издеваюсь над базовым методом из класса контроллера с использованием рамки NSubstitue

Вот мой класс контроллера ниже, метод действия Index() вызывает базовый метод GetNameNodeStatus(). Теперь, как я могу издеваться над GetNameNodeStatus(), существующим в базовом классе, когда метод действия Index называет его, используя фальшивые структуры Nsubstitute.

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 в качестве зависимости от контроллера, чтобы иметь возможность заменить его при тестировании.

Первый абстрактный ClusterMonitoring за интерфейсом

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

и он наследует этот интерфейс

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

контроллера Update, чтобы принять зависимость

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

Теперь обновлять тест, чтобы ввести зависимость с помощью конструктора в тестируемый контроллер

[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); 
    } 
} 
Смежные вопросы