C# 如何使用NSubstitue框架从控制器类模拟基方法

C# 如何使用NSubstitue框架从控制器类模拟基方法,c#,unit-testing,testing,mocking,nsubstitute,C#,Unit Testing,Testing,Mocking,Nsubstitute,我需要在控制器类中的操作方法调用基类中存在的模拟方法 下面是我的控制器类,action方法Index()调用基本方法GetNameNodeStatus()。现在,当action方法Index使用Nsubstitute mocking框架调用基类中的GetNameNodeStatus()时,我如何模拟它呢 using Cluster.Manager.Helper; using Cluster.Manager.Messages; using System; using System.Collecti

我需要在控制器类中的操作方法调用基类中存在的模拟方法

下面是我的控制器类,action方法
Index()
调用基本方法
GetNameNodeStatus()
。现在,当action方法
Index
使用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();
        }
    }
}
命名空间NSSubstituteControllerSupport
{
[测试夹具]
公共类UnitTest1
{
[测试]
public void ValidateNameNodeStatus()
{
var验证=替换.ForPartsOf();
validation.When(actionMethod=>actionMethod.GetNameNodeStatus(Arg.Any(),Arg.Any()).DoNotCallBase();
GetNameNodeStatus(“ipaddress”,new Credential())。返回(“active”);
var controllers=replacement.For();
controllers.Index();
}
}
}

正在该方法中手动创建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) { ... }
}
并让它继承该接口

public interface IClusterMonitoring  {
    string GetNameNodeStatus(string hostName, Credential credential);
}
public class ClusterMonitoring : IClusterMonitoring {
    public virtual string GetNameNodeStatus(string hostName, Credential credential) { ... }
}
通过构造函数更新控制器以获取依赖关系

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); 
    }
}
[TestFixture]
公共类UnitTest1{
[测试]
public void ValidateNameNodeStatus(){
//安排
var expected=“active”;
var validation=Substitute.For();
GetNameNodeStatus(“,new Credential())。返回(预期);
var控制器=新的HomeController(验证);
//表演
var actual=controllers.Index()作为ViewResult;
//断言
Assert.IsNotNull(实际值);
Assert.AreEqual(预期、实际、模型);
}
}

正在该方法中手动创建ClusterMonitoring
。这意味着不可能进行替换。您需要将
ClusterMonitoring
作为依赖项注入控制器。