c# - 可以使用 NSubstitute 模拟 MVC Controller 方法吗

标签 c# unit-testing testing mocking nsubstitute

我需要测试和模拟在 Controller 中找到的方法。可以在 Controller 内部模拟方法,而无需使用 NSubstitute 框架实现接口(interface)。

这是我的 Controller 页面代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Syncfusion.Cluster.Manager
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            int result = Sum(7, 7);
            return View();
        }

        public virtual int Sum(int a, int b)
        {
            return 0;
        }
    }
}

这是我的测试代码,当我调试它时,发现总和在 Controller 内部始终为“0”。 Controller 内的 Sum 函数未被覆盖。

using System;
using NUnit.Framework;
using Manager;
using Base.Classes.Models.SecurityBase;
using NSubstitute;
using BaseProject;
using System.Web.Mvc;
using System.Web.Http;

namespace NSubstituteControllerSupport
{
    [TestFixture]
    public class UnitTest1
    {
        [Test]
        public void TestMethod1()
        {
            var controller = new HomeController();           
            //var actionMethod = Substitute.For<HomeController>();
            //actionMethod.Sum(Arg.Any<int>(), Arg.Any<int>()).Returns(14);
            //var actual = controller.Index();

            var validation = Substitute.ForPartsOf<HomeController>();
            validation.When(x => x.Sum(a: Arg.Is(7), b: Arg.Is(7))).DoNotCallBase();
            validation.Sum(7, 7).Returns(14);
            var actuals = controller.Index();

        }
    }
}

这是我的类库项目的测试代码,我成功地模拟了一个方法而没有实现接口(interface)。

[Test]
public void TestMethod2()
{
    #region variableDecleration
    var adHost = new ActiveDirectoryHost();
    adHost.AdPath = @"C:\User\Security\1.0.0.0";
    adHost.CnNames = "CN=USERS";
    adHost.DomainName = "USER.COM";
    adHost.DomainPath = "DC=USER,DC=COM";
    adHost.Fqn = "HOSTNAME.USER.COM.USER.COM";
    adHost.HostName = "hostname.user.com";
    adHost.OuPath = "OU=NewSecur";
    adHost.SuperGroupName = "usergroup_1";
    adHost.IpAddress = "xxx.xx.xx.x";
    var adUserName = "username";
    var adPassword = "password";
    #endregion variableDecleration

    var validation = Substitute.ForPartsOf<ValidationHandler>();
    validation.GetUserGroupList(userName: Arg.Is(adUserName ), recursive: Arg.Is(false), adHost: Arg.Is(adHost), adUsername: Arg.Is(adUserName), adPassword: Arg.Is(adPassword)).Returns("usergroup_1,usergroup_2");
    var isUserInGroup = validation.IsUserMemberOfGroup(adUsername, "usergroup_1", adHost, adUserName, adPassword);
    Assert.That(isUserInGroup, Is.EqualTo(true));
}

最佳答案

下面应该做的工作:

// arrange
var controller = Substitute.For<HomeController>();
controller.Sum(7, 7).Returns(14);

// act
var actual = controller.Index();

// assert
...

关于c# - 可以使用 NSubstitute 模拟 MVC Controller 方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824352/

相关文章:

c# - 如何从谷歌图片搜索中获取图片 URL-s

c# - 将 SolidColorBrush 绑定(bind)到 ControlTemplate 背景

php - Laravel 在单元测试中不启动特征/验证用户

安卓工作室 "No tests were found"

c# - 获取唯一字符串 C#

C# - 使用 ListBox 或 ListView 动态滚动?

spring-boot - 属性 'sqlSessionFactory' 或 'sqlSessionTemplate' 在 spring mock mvc test for spring boot with mybatis 中是必需的

android - 通过包名启动 Activity

python - Python 3.x 中的单元测试 'pathlib.Path.is_file'

c++ - 如何强烈分解代码单元测试一堆函数的所有参数