我制作了一个自定义模型,想要模拟它。我对MVC相当新,对单元测试非常新。我看到的大多数方法都是为类创建一个接口,然后创建一个实现相同接口的模拟。但是,当将接口实际传递给视图时,我似乎无法让它起作用。以下是一个“简化”的示例:
模型-
控制器-
在HttpPost期间,我遇到了“无法创建接口实例”的异常。看起来我不能同时传递模型和模拟对象进行单元测试。也许有更好的方法来对绑定视图的模型进行单元测试?谢谢,Med。
模型-
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...
}
View-
<%@ 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期间,我遇到了“无法创建接口实例”的异常。看起来我不能同时传递模型和模拟对象进行单元测试。也许有更好的方法来对绑定视图的模型进行单元测试?谢谢,Med。