我做了一个自定义模型,我想嘲笑它。我对MVC相当陌生,对于单元测试也很新颖。我见过的大多数方法都为这个类创建了一个接口,然后做了一个实现相同接口的模拟器。但是,当我真正将接口传递给View时,我似乎无法得到这个工作。线索 “简化” 例如:如何在ASP.NET MVC中模拟模型?
型号 -
public interface IContact
{
void SendEmail(NameValueCollection httpRequestVars);
}
public abstract class Contact : IContact
{
//some shared properties...
public string Name { get; set; }
public void SendEmail(NameValueCollection httpRequestVars = null)
{
//construct email...
}
}
public class Enquiry : Contact
{
//some extra properties...
}
查看 -
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<project.Models.IContact>" %>
<!-- other html... -->
<td><%= Html.TextBoxFor(model => ((Enquiry)model).Name)%></td>
控制器 -
[HttpPost]
public ActionResult Index(IContact enquiry)
{
if (!ModelState.IsValid)
return View(enquiry);
enquiry.SendEmail(Request.ServerVariables);
return View("Sent", enquiry);
}
单位测试 -
[Test]
public void Index_HttpPostInvalidModel_ReturnsDefaultView()
{
Enquiry enquiry = new Enquiry();
_controller.ModelState.AddModelError("", "dummy value");
ViewResult result = (ViewResult)_controller.Index(enquiry);
Assert.IsNullOrEmpty(result.ViewName);
}
[Test]
public void Index_HttpPostValidModel_CallsSendEmail()
{
MockContact mock = new MockContact();
ViewResult result = (ViewResult)_controller.Index(mock);
Assert.IsTrue(mock.EmailSent);
}
public class MockContact : IContact
{
public bool EmailSent = false;
void SendEmail(NameValueCollection httpRequestVars)
{
EmailSent = true;
}
}
在HttpPost上,我得到一个“无法创建接口的实例”异常。我似乎无法拥有我的蛋糕(通过一个模型)并吃掉它(通过模拟单元测试)。也许有一种更好的方法来绑定到视图的单元测试模型?
感谢,
医学
btw,一个“model”通常不包含逻辑(如SendEmail()) – Will 2010-11-11 17:28:57
让我们不要打开skinny/fat控制器/模型的蠕虫病毒!你认为SendEmail()应该去哪里? – med4th 2010-11-11 17:59:16