public void SaveStatus(Status newStatus);
上述方法将一些新状态保存到数据库中。是否应返回类似布尔标志的内容来指示保存操作的成功或失败。存储库层方法返回类型
在写一个单元测试,我得到了什么我主张一个问题,SaveStatus()
是否成功与否。如果没有抛出异常,在单元测试的情况下可以认为是成功的。
什么是解决这个问题的最佳做法?
public void SaveStatus(Status newStatus);
上述方法将一些新状态保存到数据库中。是否应返回类似布尔标志的内容来指示保存操作的成功或失败。存储库层方法返回类型
在写一个单元测试,我得到了什么我主张一个问题,SaveStatus()
是否成功与否。如果没有抛出异常,在单元测试的情况下可以认为是成功的。
什么是解决这个问题的最佳做法?
NO
的method's名字让我们清楚知道它的合同:它必须保存状态。当一个方法出于任何原因不能做它必须做的事时,它必须抛出一个异常,这就是OOP的工作方式。如果返回错误代码或标志,你将结束其在所有呼叫者以下:
if(xxx.SaveStatus(newStatus)){
// do something
}
else
{
// and here.. what? return another boolean???? Ignore it???? ummmm
}
如果失败的话,你会得到一个例外,那就够了。
在你的UT,你必须断言新的状态保存,要做到这一点,你必须使用例如或者任何你正在使用存储库来嘲笑你的数据库访问。
不,这是没有意义的。返回函数 的值返回void是无效的,但您可以返回布尔值。从你所称的功能获得所需的输出只不过是它的成功。
如果你关心的成功,则是你可以返回一个布尔值,表示成功/失败。另一个可能的选择是抛出异常。我更喜欢使用布尔值作为返回值而不是抛出异常。如果在该方法中发生异常,我将在SaveStatus
方法内处理它们并返回一个错误。
我之所以不倾向于在这种情况下抛出异常是因为它可以在你的应用程序的性能产生负面影响。微软标准规定“for code that routinely fails, you can use design patterns to minimize performance issues”。
我要和你的第二点不同意,我不会考虑DB故障为“*例行*”失败。您不应该*期望*您的数据库失败,因此异常更合适。 – James
不,它不应该。这将是明显违反Command Query Separation。一种方法应该返回或突变某种状态,从来都不会。
由于您使用.NET,你应该利用例外指示失败。
抛出一个异常来指示失败。这允许您包含应用程序逻辑可以用来决定如何处理故障的故障细节。要@ Hexxagonal的角度来看,这可能是一个坏的技术,如果代码失败了很多,但如果你的版本库层失败了不少,性能不会是你最关心的问题。
进行单元测试,模拟所述存储机制(数据库?),并验证该模拟呼叫。我为此推荐Moq。
你可以提出一个关于CQS的评论,把最后的东西放入。:) –