asp.net-mvc – ASP .Net MVC 3:单元测试控制器动作
发布时间:2020-05-24 08:29:41 所属栏目:asp.Net 来源:互联网
导读:我是单元测试和模拟概念的新手.我想弄清楚如何为下面的基本开箱即用用户注册代码编写一个好的测试用例: [HttpPost]public ActionResult Register(RegisterModel model){ if (ModelState.IsValid) { // Attempt to register the user Membe
|
我是单元测试和模拟概念的新手.我想弄清楚如何为下面的基本开箱即用用户注册代码编写一个好的测试用例: [HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName,model.Password,model.Email,null,true,out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName,false /* createPersistentCookie */);
return RedirectToAction("Index","Home");
}
else
{
ModelState.AddModelError("",ErrorCodeToString(createStatus));
}
}
// If we got this far,something failed,redisplay form
return View(model);
}
以下是我需要您的意见/帮助的一些具体要点: >我不一定要在ASP .Net成员资格数据库中创建新用户. 解决方法你的代码有问题.您的操作取决于静态方法:Membership.CreateUser.正如您所知,静态方法是用于单元测试的PITA.所以你可以通过引入一个抽象级别来削弱耦合: public interface IMyService
{
MembershipCreateStatus CreateUser(string username,string password,string email);
}
然后有一些使用当前成员资格提供者的实现: public class MyService: IMyService
{
public MembershipCreateStatus CreateUser(string username,string email)
{
MembershipCreateStatus status;
Membership.CreateUser(username,password,email,out status);
return status;
}
}
最后是控制器: public class AccountController : Controller
{
private readonly IMyService _service;
public AccountController(IMyService service)
{
_service = service;
}
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
var status = _service.CreateUser(model.UserName,model.Email);
if (status == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName,false /* createPersistentCookie */);
return RedirectToAction("Index","Home");
}
else
{
ModelState.AddModelError("",ErrorCodeToString(createStatus));
}
}
// If we got this far,redisplay form
return View(model);
}
}
好了,既然我们已经削弱了耦合,我们可以使用模拟框架来模拟单元测试中的服务并使其变得微不足道. 例如,使用Rhino Mocks,您可以创建以下测试以涵盖2个故障情况: [TestMethod]
public void Register_Action_Should_Redisplay_View_If_Model_Is_Invalid()
{
// arrange
var sut = new AccountController(null);
var model = new RegisterModel();
sut.ModelState.AddModelError("","invalid email");
// act
var actual = sut.Register(model);
// assert
Assert.IsInstanceOfType(actual,typeof(ViewResult));
var viewResult = actual as ViewResult;
Assert.AreEqual(model,viewResult.Model);
}
[TestMethod]
public void Register_Action_Should_Redisplay_View_And_Add_Model_Error_If_Creation_Fails()
{
// arrange
var service = MockRepository.GenerateStub<IMyService>();
service
.Stub(x => x.CreateUser(null,null))
.IgnoreArguments()
.Return(MembershipCreateStatus.InvalidEmail);
var sut = new AccountController(service);
var model = new RegisterModel();
// act
var actual = sut.Register(model);
// assert
Assert.IsInstanceOfType(actual,viewResult.Model);
Assert.IsFalse(sut.ModelState.IsValid);
}
最后的测试是成功案例.我们仍然有一个问题.问题是以下行: FormsAuthentication.SetAuthCookie(model.UserName,false); 这是什么?这是一个静态方法调用.因此,我们采用与成员资格提供程序相同的方式来削弱控制器和表单身份验证系统的耦合. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – Windows应用程序与Web应用程序开发
- asp.net – 如何使用EntityFramework种子数据代码第一次迁移
- ASP.NET Response.Cache.SetNoStore()与Response.Cache.Set
- asp.net – 通过调用.ashx页面下载文件
- asp.net – 找出.NET创建的HTML元素的客户端ID?
- asp.net – 当主机名中有下划线时,表单身份验证无法识别为在
- asp.net-mvc – 有没有人知道让Ninject 2在ASP.NET MVC中工
- asp.net-mvc-4 – MVC4最小参考
- asp.net – AppendHeader是否与AddHeader完全相同?
- asp.net-mvc – Kendo Grid Edit InLine Custom Validation
推荐文章
站长推荐
- asp.net-mvc-3 – Editor用于收集我的模型中的项
- 我是一名ASP.NET程序员(Webforms).我应该切换到M
- asp.net-mvc – ASP.NET MVC5/IIS Express无法调
- asp.net中DataBinding的可维护性最佳实践
- asp-classic – 经典ASP的好IDE?
- 什么是使用aspnet_compiler.exe预编译ASP.NET项目
- asp.net – TeamCity可以使用sln2008构建运行程序
- 如何在ASP.NET RadioButtonList中的项之间添加空
- asp.net-mvc – 在ASP.Net MVC中定义自定义URL路
- ASP.NET [图像处理程序]
热点阅读
