可以使用NSubstitute来模拟MVC控制器方法

时间:2017-01-24 09:21:02

标签: c# unit-testing testing mocking nsubstitute

我需要测试并模拟在控制器中找到的方法。可以在控制器内部模拟一个方法,而无需使用NSubstitute框架实现接口。

这是我的Controller页面代码。

@Override
protected void onPostExecute(List<Task> tasks) {
    tasks.addAll(tasks);
    //Update listview adapter . Which already has the updated items 
    //assuming your listview adapter variable is listViewAdapter
    listViewAdapter.notifyDataSetChanged();
}

这是我的测试代码和总是被发现为&#39; 0&#39;在我调试它的时候在控制器内部。控制器内的Sum函数不会被覆盖。

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

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

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

        }
    }
}

1 个答案:

答案 0 :(得分:2)

以下应该做的工作:

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

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

// assert
...