我该如何对这个模块进行单元测试?

时间:2012-07-09 17:34:55

标签: ruby-on-rails unit-testing testing bdd

我现在已经在很短的时间内完成了Rails开发,但是很快就完成了它。我仍然遗失的一个领域是编写测试。

我理解如何编写测试,但我永远不知道我应该测试什么,并且让我很难真正开始编写我自己的测试。

我最近写了一个gem用于我正在进行的项目的API,并认为这将是我编写一些测试的最佳时间。我仍然对我应该测试的内容感到迷茫。

我希望如果我发布了我的一个课程,其中有一些方法可能会让我对我应该测试的内容有所了解。

我正在使用的API返回JSON对象,因此我的所有方法实际上只是帮助生成GET请求并将JSON返回给我正在构建的应用程序。我正在使用HTTParty gem来发出get请求。

第一种方法只列出了有关特定广告客户的一些信息:

    module MyModule

    class User < MyObject

      # User
      # This will list information about a specific user
      # required parameter(s):
      #     user_id
      # example:
      #   MyModule.connect("Your API Key")
      #   MyModule::User.list(5)
      # returns:
      #   Returns a single result with the following properties:
      # {
      #    "user_name":"blah",
      #    "user_id":253,
      #    "last_login":"2011-03-01"
      # }   
         def list(user)
      MyModule.get("/users/#{user}")
         end
    end
   end

我最初的猜测是我会测试以确保这个JSON对象返回正确的属性,但我不完全确定。

我是否还需要进行测试以确保传入方法的参数是否存在或者是我不应该担心的事情?

3 个答案:

答案 0 :(得分:1)

单元测试应检查某些对象或方法的行为,而不是对象组成。即便如此,你真的只能在这里测试一些东西:

  1. 您的GET请求成功(或不成功)。
  2. 你得到有效的JSON(或不是)。
  3. 你的记录没有被破坏。
  4. 您可能应该稍微高一些的测试。例如,我测试了这个用户故事:

    Given a record with some reasonable fixture data,
    When the record is successfully retrieved
    Then your application does something useful with it.
    

答案 1 :(得分:0)

关于测试的事情是由你决定你想要多么彻底。在理想的世界中,您将对应用程序的每个方面进行测试。看到你可能正在进行一个侧面项目,并且花在编写应用程序上的时间更好,我认为只需要基本的流量测试就可以满足你的需求。

是的,检查正确的JSON属性将是一个良好的开端。

你没有提到你正在使用的测试套件 - 如果你已经没有任何想法,我会推荐rspec。

希望有所帮助,

里根

答案 2 :(得分:0)

当我不认为它是一种测试时,我发现它有所帮助,而是将其视为我班级行为的一个例子。 @ CodeGnome的答案非常有用。通过阅读代码和您的描述,您有一个明显有价值的行为方面:您的课程查找有关广告用户的登录信息。 (请原谅我对Ruby和Rails特定语法缺乏了解,与@CodeGnome一样,但有一个更具体的例子)。

您的班级“应检索广告用户的上次登录日期”。这看起来像是与其行为相匹配的描述,您可以在此之后命名您的测试方法。

现在想想一些特定的例子。是否根据用户检索不同的数据?如果用户之前没有登录怎么办?如果用户ID错误怎么办? MyModule是否始终可用,或者如果您丢失了移动连接,它是否可用?那你会做什么?您的班级“应该升级连接错误”吗?

通过这种方式思考,你会发现行为的不同方面和不同的例子。像RSpec这样的东西可以帮助你轻松地说出这些内容,或者你可以just_use_underscored_test_names

如果你没有拥有不同的行为方面,你可能会有过早的重构/优化,以及太多的抽象层。

请记住,您正在查看类如何表现以及它有何价值的示例,以便您可以记录它并使其易于理解。您正在使用它来帮助改进您的类的职责,以使其保持可维护性。它实际上并不是关于测试的。