当前位置: 首页 > 知识库问答 >
问题:

如何对调用与控制器关联的服务的MVC控制器操作进行单元测试

段干华晖
2023-03-14

好的,我试过了。但我不能把我的头缠在这上面。

我有控制器

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

    }

问题是,当调用Create方法时,它需要使用Svc来处理操作,所以我想我必须嘲笑它!但我不知道怎么做。

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

共有1个答案

华森
2023-03-14

您不应该嘲笑控制器,因为这是您试图测试的内容。正如您所说,您必须模拟svc属性。一种可能的解决方案是在抽象extcontroller中重写该属性,然后在Coursecontroller中重写该属性。现在可以将SVC属性设置为单元测试中的模拟。

 类似资料:
  • 问题内容: 我有一个与此类似的简单带注释的控制器: 我想用这样的单元测试来测试它: 问题是AnnotationMethodHandlerAdapter.handler()方法引发异常: 问题答案: 从Spring 3.2开始,有一种适当的方法可以轻松,优雅地进行测试。您将可以执行以下操作: 有关更多信息,请访问http://blog.springsource.org/2012/11/12/spri

  • 问题内容: 我正在尝试创建一个简单的单元测试来测试我的表演功能。 我收到以下错误: 看来这不是控制器的范围吗? 这是我的控制器: 这是我的控制器单元测试: 问题答案: 为什么不简单地使用spyOn函数? 希望这可以帮助!

  • 问题内容: 我正在关注Spring 2.5教程,并尝试同时将代码/设置更新为Spring 3.0。 在 Spring 2.5中, 我有了 HelloController (供参考): 还有一个用于 HelloController 的JUnit测试(供参考): 但是现在我将控制器更新为 Spring 3.0 ,并且现在使用注释(我还添加了一条 消息 ): 知道我正在使用JUnit 4.9,有人可以解

  • 问题内容: 我有以下情况: controller.js controllerSpec.js 错误: 我也尝试过类似的方法,但没有成功: 我该如何解决?有什么建议? 问题答案: 有两种方法(或肯定有更多方法)。 想象一下这种服务(无论它是工厂都没关系): 使用此控制器: 一种方法是使用要使用的方法创建对象并对其进行监视: 然后,将其作为dep传递给控制器​​。无需注入服务。那可行。 另一种方法是模拟

  • 问题内容: 对于我一生,我无法让$ httpBackend在执行$ http get请求的控制器上工作。我已经尝试了几个小时=) 我将其简化为下面可以最简单的形式。如果我通过测试 在控制器中注释掉$ http.get()请求 在测试中注释掉“ httpMock.flush()” 并更改“猪”和“狗”以匹配 也就是说,这是一个有效的工作测试和应用程序。 如果放回去,则会在底部显示错误。 app /

  • 我对使用Spring控制器进行单元测试的概念是新的。我正在遵循我在网上找到的一些示例,并尝试实现他们的测试策略。这是我的基本控制器: 这是我的单元测试: 看起来很简单,但我得到了以下错误: 它完成了这项工作,但它没有像我之前尝试的那样使用任何Spring注释…这种方法是不好的,所以试图弄清楚为什么每当我在测试文件中包含注释时,总是会出现错误。 我的POM: