我有一个ApiController。
<HttpGet>
Public Function Find(ByVal planId As Integer) As IHttpActionResult
Dim results As IHttpActionResult
Try
Dim model As PlanModel = plansDAL.GetPlan(planId)
If model IsNot Nothing Then
results = BadRequest(String.Format("Plan {0} was not found.", planId))
Else
results = Ok(model)
End If
Catch ex As Exception
results = BadRequest(String.Format("Plan {0} was not found.", planId))
End Try
Return results
End Function
我更喜欢没有这样的嵌套语句。
我想知道在控制器操作失败/重定向/完成插入时返回正确结果的更好模式。因此控制器可以返回200 ok和content,或者它可能返回404 not found。
我知道要尝试的东西,但我宁愿使用一些既定的模式。我的想法是添加一个Response类型的私有成员。然后我可以在我的控制器中更新该对象并返回一次,最后只返回一次。
但是,我不知道如何做到这一点,我不会给开发人员带来负担,每次都能正确制作回复。
答案 0 :(得分:0)
我认为这个article on mvc4 提供了我正在寻找的模式。 它似乎简化了方法,并提供了一种机制,可以用明确的期望来进行单元测试。它还确保未处理的异常被冒泡并返回YSOD,直到它们被处理为止。可能,它们可以在全局错误模块中处理。
下面的所有代码都是在没有IDE的情况下编写的,可能存在语法错误
<HttpGet>
Public Function Find(ByVal planId As Integer) As IHttpActionResult
Dim model As PlanModel = plansDAL.GetPlan(planId)
If model is Nothing Then
throw new HttpResponseException(HttpStatusCode.NotFound)
End If
Return Ok(model)
End Function
现在,为了额外的奖励。因为我正在回答我自己的问题。如果我知道想要编写单元测试,那么它们就非常直接了。
<TestMethod>
public sub Should_Return_Ok_When_Plan_Is_Found()
dim mockedService as new Mock(Of plansDAL)
dim mockPlan as new PlanModel 'set this up however to be the expected values.
dim controller as new PlanController()
mockedService.setup(sub(s) s.GetPlan(it.isAny(Of Integer))).returns(mockPlan)
dim result as IHttpActionResult = controller.find(1)
Assert.areEqual(mockPlan,result.contents)
end sub