Ruby on rails 您对控制器进行了多少测试?

Ruby on rails 您对控制器进行了多少测试?,ruby-on-rails,rspec,bdd,Ruby On Rails,Rspec,Bdd,我目前正在开始与BDD-我没有写任何测试之前。 我总是尽量让我的模特胖,让我的控制器瘦 您认为控制器规格是否必要 向您问好是的。测试正在进行的调用是否正确,以及是否在必要时进行了正确的重定向和设置,并测试是否呈现了正确的页面。因此,请测试您的应用程序是否按预期运行。就我而言,我试图理解在测试中寻求高水平的代码覆盖率与维护一组可能非常脆弱的测试的长期成本之间的平衡 假设我们有一个控制器 try { result = mode.doSomething();

我目前正在开始与BDD-我没有写任何测试之前。 我总是尽量让我的模特胖,让我的控制器瘦

您认为控制器规格是否必要


向您问好是的。测试正在进行的调用是否正确,以及是否在必要时进行了正确的重定向和设置,并测试是否呈现了正确的页面。因此,请测试您的应用程序是否按预期运行。

就我而言,我试图理解在测试中寻求高水平的代码覆盖率与维护一组可能非常脆弱的测试的长期成本之间的平衡

假设我们有一个控制器

    try {
        result = mode.doSomething();

        if  (result.count == 0 )
             message = "none found"
             redisplay criterion page
        else if (result.count == 1 ) 
             display detail page
        else 
             display list page
    } catch exception {
        message = "bad things happened, please try again"
        redisplay criterion page
    }
一个初步的想法是,三个计数案例(0、1、多个)的测试可能没有execption案例的测试有价值,而且更容易发生变化。价值较低,因为a)。其他测试将捕获页面显示b)中的问题。测试非常接近于简单地复制代码

    code: go to page X
    test: did you go to page X?
如果开发人员错误地选择了X,那么测试也会出错!如果用户界面的可用性测试显示Y页面更适合显示,那么我们将同步更新代码和测试。这次测试真的取得了什么成果吗

然而,在正常的UI测试中,异常情况可能很难执行,并且很容易使用模拟进行测试。而且,我们确实需要纠正异常之后的行为

您认为控制器规格是否必要

如果你把它们和一个好的集成测试结合起来,我不认为它们是必要的。我发现应用程序的可用性非常重要,因此对于控制器/视图中的每一个更改,我都会单击应用程序并了解它的感觉。在我看来,为控制器和视图创建“哑”测试没有多少额外价值


对于集成测试,我使用Cucumber。这样就可以测试整个堆栈,并确保应用程序以您想要的方式执行。对于业务逻辑(fat模型),我仍然使用RSpec。

我已经通过Cucumber测试了视觉行为的许多部分。我假设您首先编写了重定向到X的测试。当更改操作重定向的位置时,首先更改测试,然后使其通过。验证这一点要比登录应用程序并查看其是否有效快得多。即使使用cucumber,规范/测试的运行速度仍然快于功能的设置和爬网。我坚信“如果你写了一行代码,首先要写一个失败的单元测试”。但是,如果您想避免这些,请使用继承的_资源之类的抽象,并停止编写代码和测试。在某个时候,我们需要运行该应用程序来测试美观性、易用性等。那时重定向中的缺陷就会被发现。我们是在重复努力吗?我们是否发现了足够的缺陷来保证我们的努力?假设我们在编写三行代码之前没有编写三行代码的测试(甚至通过正式文档化的策略),那么影响会有多大?手动测试可能会发现缺陷,但为什么要让测试人员看到您可以通过rspec+cumber轻松捕获的东西呢?您可以轻松地自动化许多不同的测试用例,并且可以在最终用户发现缺陷时添加新的测试用例。记住,这些测试不仅仅是为了你构建一个应用程序,它们还可以帮助你以后维护它,特别是当你想进行框架更新时。魔鬼代言人说:因为测试人员无论如何都会“轻松”而不是什么都不做。当然,测试的维护和初始开发一样多,因此有维护成本,随着UI的变化,案例会发生变化,许多(每一个?)失败都是由mods修复到测试案例中的,我们从来没有发现任何真正的bug。Struts的新版本或任何东西都不会破坏“if result==2进入A页”的代码,我们将对结果为2进行单元测试。