C# 如何使用NSubstitue框架从控制器类模拟基方法
我需要在控制器类中的操作方法调用基类中存在的模拟方法 下面是我的控制器类,action方法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
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
作为依赖项注入控制器。