2011-08-18 32 views
1

我正在开发一个应用程序,并且希望在与项目过多之前提高我的测试覆盖率。 到目前为止,我在模型层上有相当好的测试覆盖率,但控制器倾向于获得很多逻辑(积累东西并从模型结果计算)。适用于单元测试的类的一般结构

有没有人有关于如何构建我的应用程序的建议,以便所有部件都易于测试?当然,我可以重构控制器中的所有逻辑,只对每个控制器方法调用一个不同的类,然后只使用控制器中的渲染方法,但看起来有点激烈。

有没有一种方法可以让我看一下结果后一种方法,在控制器中运行,如

public static void controllerMethod(String a){ 
    String result = doSomething(); 
    String calcResult = calculateSomething(a); 
    render(result, calcResult) 
} 

我怎样才能测试这种方法的预期成果和后calcResult就是我想要它在单元测试中?

该网站上的所有示例都是关于测试模型图层的。我知道我可以对控制器运行功能测试,但对于我想测试的内容来说,这有点浅。

如果您对如何构建我的课程以获得易于测试的应用程序有任何建议,请让我知道。

+0

我不知道你是怎么做到的......一个测试总是一个外部测试包装了一个函数的调用。你不能在函数本身内测试部分结果。这不是调试:(我唯一看到的是使用经典的JUnit对每个函数进行单元测试,然后编写一个函数来测试整个controllerMethod。 – mandubian

回答

1

控制器任务应该(主要)控制应用程序的流程(下一个显示哪个页面)。为此,您可以在Play中使用selenium tests

如果您发现自己在控制器中添加了大量登录名,请将其移动到相关模型中的方法(如果适用)或创建管理复杂部分的中间层(ala Services)。他们将比控制器更容易测试,并且可以让您重用多个控制器上的逻辑(例如,通过REST API调用浏览器访问)

+0

这实际上是我正在考虑的事情,也是我意思是将逻辑移出控制器,然后移入其他类(如服务层)。感谢您的回答 – Tommy

0

“我该如何测试在此方法之后预期结果和calcResult是我想让它成为一个单元测试?“ 不要针对controllerMethod(Sting a)运行JUnit测试,而是针对doSomething()和calculateSomething(a)运行两个JUnit测试。由于两者都返回字符串,这是直截了当的。

编辑。还要考虑制作一个与“生产”代码具有相同软件包名称的独立测试项目,因为它可以测试软件包范围的方法。

+0

问题在于这些方法可能是私有的,我不想将它们公开以便测试。 – Tommy

+0

使你的方法受到保护,然后你可以用JUnit访问它们,只要它们具有相同的包名即可 也有一种方法可以在这种情况下测试私有方法。通过反射测试 – Farmor

+1

对不起,但我不喜欢为了测试而改变能见度的方法如果事情很难测试你是​​你做出错误的事情。我想我会为Pere Villega提出的建议,并将我可以进入的模型类,然后将其余的逻辑移入服务层。然后我的控制器将变得很苗条,所有的代码都会很容易测试。感谢您的回复 – Tommy

相关问题