public void SaveStatus(Status newStatus);
上述方法将一些新状态保存到数据库中。它是否应该返回诸如布尔标志之类的东西来指示保存操作的成功或失败。
在编写单元测试时,我遇到了一个关于我断言的问题,是否SaveStatus()
成功。如果没有抛出异常,在单元测试的情况下可以认为是成功的。
这方面的最佳做法是什么?
public void SaveStatus(Status newStatus);
上述方法将一些新状态保存到数据库中。它是否应该返回诸如布尔标志之类的东西来指示保存操作的成功或失败。
在编写单元测试时,我遇到了一个关于我断言的问题,是否SaveStatus()
成功。如果没有抛出异常,在单元测试的情况下可以认为是成功的。
这方面的最佳做法是什么?
不,这没有意义。从返回 void 的函数返回值是无效的。不过,您可以返回布尔值。从您调用的函数中获得所需的输出只不过是它的成功。
不
该方法的名称让我们清楚地知道它的契约:它必须保存状态。当一个方法由于任何原因不能做它必须做的事情时,它必须抛出一个异常,这就是 OOP 的工作方式。如果您返回错误代码或标志,您将在所有调用者中结束以下内容:
if(xxx.SaveStatus(newStatus)){
// do something
}
else
{
// and here.. what? return another boolean???? Ignore it???? ummmm
}
如果它失败了,你会得到一个异常,这就足够了。
在您的 UT 中,您必须断言新状态已保存,为此您必须使用例如存储库或您正在使用的任何东西来模拟您的数据库访问。
不,不应该。这将明显违反Command Query Separation。一个方法应该要么返回一些东西,要么改变一些状态,而不是两者兼而有之。
由于您使用的是 .NET,因此您应该利用异常来指示失败。
抛出异常表示失败。这允许您包含应用程序逻辑可以用来决定如何处理故障的故障详细信息。对于@Hexxagonal 的观点,如果代码失败很多,这可能是一种不好的技术,但是如果您的存储库层失败很多,性能将不是您最关心的问题。
要进行单元测试,请模拟存储机制(数据库?)并验证模拟上的调用。我为此推荐起订量。
如果您关心成功,那么是的,您可以返回一个指示成功/失败的布尔值。另一个可能的选择是抛出异常。我更喜欢使用布尔值作为返回值而不是抛出异常。如果该方法中确实发生了异常,我将在该方法中处理它们SaveStatus
并返回 false。
在这种情况下我不倾向于抛出异常的原因是因为它会对应用程序的性能产生负面影响。微软标准规定“对于经常失败的代码,您可以使用设计模式来最小化性能问题”。