好的,我试过了。但是我无法绕过这个。
我有一个控制器
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),具有此体系结构概述
答案 0 :(得分:0)
您不应该模拟控制器,因为这是您要测试的内容。就像你说的那样你必须嘲笑Svc
财产。一种可能的解决方案是在摘要ExtController
中使属性可覆盖,然后在CourseController
中覆盖它。您现在可以在单元测试中将Svc
属性设置为模拟。