【发布时间】:2016-08-14 23:06:15
【问题描述】:
我有一个要使用 Moq 进行单元测试的过程的表单帖子。 我有用于单元测试 Get WebApi 方法的工作代码,效果很好,但我不确定如何在 MVC 控制器中将帖子写到 void 方法。
我想测试 ModelState.IsValid,如果无效则返回异常。
控制器
public class HomeController : Controller
{
private IEditDataRepository _editDataRepository;
public HomeController()
{
//Default Constructor
}
//Dependency Injection using Unity.MVC5 NuGet Package
public HomeController(IEditDataRepository editDataRepository)
{
_editDataRepository = editDataRepository;
}
[HttpPost]
[ValidateAntiForgeryToken]
public void Edit([Bind(Include = "Field1,Field2")] FormViewModel model)
{
if (ModelState.IsValid)
{
_editDataRepository.Edit(model);
}
else
{
throw new HttpException(400, "ModelState Invalid");
}
}
}
存储库
public class EditDataRepository : IEditDataRepository, IDisposable
{
private DBEntities db = new DBEntities();
public void Edit(FormViewModel model)
{
db.MyProcedure(model.Field1,model.Field2);
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
单元测试
我可以在这里进行一些设置,但之后我不确定。 如何检查 ModelState.IsValid 和无效(返回异常)?
[TestMethod]
public void TestSomething()
{
//Arrange
var mockRepository1 = new Mock<IEditDataRepository>();
mockRepository1
.Setup(x => x.Edit(It.IsAny<FormViewModel>()));
HomeController controller = new HomeController(mockRepository1.Object);
//Act
controller.Edit(It.IsAny<FormViewModel>());
//Assert
}
【问题讨论】:
-
只需将无效的
FormViewModel传递给编辑操作。 -
或者手动设置模型状态:stackoverflow.com/questions/3822873/…
-
很好奇,为什么你对控制器的操作无效?
-
Nkosi - 不太确定。我想在我真正知道自己在做什么之前,我只是在处理旧代码。你认为这应该是什么,ActionResult?我想我这样做是因为它只是在运行更新,我只需要知道它是否失败。
标签: c# asp.net-mvc unit-testing asp.net-mvc-4 moq