如何对调用与Controller关联的服务的MVC Controller Action进行单元测试

时间:2015-03-26 06:43:57

标签: c# asp.net-mvc unit-testing mocking

好的,我试过了。但是我无法绕过这个。

我有一个控制器

public sealed class CourseController : ExtController
{
 [HttpPost, PersistState, InRole("")] //TODO [SECURITY] [FIX] UPDATE SECURITY ROLES ]

    public ActionResult Create(string[] flags, string name, string code, string description)
    {
        try
        {
            var Course = Svc.ProcessOperation("CreateCourse", new
            {

                Flags = flags.Merge(",")
            });



            Svc.ProcessOperation("CreateCourseTranslation", new
            {
                CourseId = Course.EntityID,
                LanguageId = JAs.Int32(Svc.Localization.Language.EntityID),
                Name = name,
                Description = description,
                Code = code

            });
            TempData.PersistStatus("Success");

            return View();
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("API", ex);
            TempData.PersistStatus("Failed");
        }
        return RedirectToAction("Create");
    }
}

Svc 是ExtController抽象类中的服务类型的公共属性,后者又扩展了Controller类

 /// <summary>
/// Represents the exteded controller.
/// </summary>
public abstract class ExtController : Controller
{
    #region Properties

    /// <summary>
    /// Gets the service associated with the controller.
    /// </summary>
    public Service Svc
    {
        get
        {
            return HttpContext.Svc();
        }
    }

    #endregion
}

这是使用 NUnit

的单元测试代码
 [Test]
    public void Create_HttpPost_Action_Returns_Create_View()
    {
        // Arrange          
        var customersController = new CourseController();

        // Act
        var result = customersController.Create(new[] { "None" }, "courseName", "Code", "description") as ViewResult;

        // Assert
        Assert.IsNotNull(result, "Should have returned a ViewResult");
        result.AssertViewRendered().ForView("Create");

    }

T 他问题是当调用Create方法时需要使用Svc来处理操作,所以我想我必须模拟那个!但我无法弄清楚如何。

我应该嘲笑控制器!但我不能因为它是一个密封的课!或ExtController!我迷路了,需要指导。

[FWIW] 该项目基于Xenta MVC Framework (Open Source),具有此体系结构概述 Xenta Architecture Overview

1 个答案:

答案 0 :(得分:0)

您不应该模拟控制器,因为这是您要测试的内容。就像你说的那样你必须嘲笑Svc财产。一种可能的解决方案是在摘要ExtController中使属性可覆盖,然后在CourseController中覆盖它。您现在可以在单元测试中将Svc属性设置为模拟。