存储库层方法返回类型

时间:2013-01-20 05:39:15

标签: .net unit-testing

public void SaveStatus(Status newStatus);

上述方法为DB保存了一些新状态。它是否应返回类似布尔标志的内容,以指示保存操作的成功或失败。

在编写单元测试时,我得到了一个关于我断言的问题,SaveStatus()是否成功。如果没有抛出异常,则在单元测试的情况下可以认为是成功的。

围绕此最佳做法是什么?

5 个答案:

答案 0 :(得分:1)

不,这没有意义。从函数返回值无效 返回void.you可以返回布尔值。从你所谓的功能获得所需的输出只不过是它的成功。

答案 1 :(得分:1)

方法的名称让我们清楚地知道它的合同:它必须保存状态。当一个方法由于任何原因不能做它必须做的事情时,它必须抛出异常,就像OOP的工作方式一样。如果您返回错误代码或标记,您将在所有调用者中结束以下操作:

if(xxx.SaveStatus(newStatus)){
   // do something
}
else
{
   // and here.. what? return another boolean???? Ignore it???? ummmm
} 

如果失败,你会得到一个例外,这就足够了。

在您的UT中,您必须断言新状态已保存,为此您必须使用存储库或您正在使用的任何内容来模拟数据库访问。

答案 2 :(得分:1)

不,不应该。这将明显违反Command Query Separation。一个方法应该返回一些 OR 改变一些状态,而不是两者。

由于您使用的是.NET,因此应该利用异常来指示失败。

答案 3 :(得分:1)

抛出异常以指示失败。这允许您包含应用程序逻辑可用于决定如何处理故障的故障详细信息。对于@ Hexxagonal而言,如果代码失败很多,这可能是一种糟糕的技术,但如果您的存储库层失败很多,性能将不是您最关心的问题。

要进行单元测试,请模拟存储机制(数据库?)并验证模拟上的调用。我为此建议Moq

答案 4 :(得分:0)

如果你关心成功,那么你可以返回一个表示成功/失败的布尔值。另一种可能的选择是抛出异常。我更喜欢使用布尔值作为返回值而不是抛出异常。如果在该方法中发生异常,我将在SaveStatus方法内处理它们并返回false。

在这种情况下我不倾向于抛出异常的原因是因为它会对应用程序的性能产生负面影响。 Microsoft标准声明“for code that routinely fails, you can use design patterns to minimize performance issues”。