1

我从事 Rails 开发已经有很短的时间了,但很快就完成了。我仍然迷失的一个领域是编写测试。

我了解如何编写测试,但我从不知道我应该测试什么,这让我很难真正开始编写自己的测试。

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

我希望如果我发布了我的一个课程,其中包含一些方法,有人可能会给我一些关于我应该测试什么的想法。

我正在使用的 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 对象返回正确的属性,但我不完全确定。

我是否还需要测试以确保传递给方法的参数是否存在,或者我不应该担心什么?

4

3 回答 3

1

单元测试应该检查某些对象或方法的行为,而不是对象组合。即便如此,您实际上只能在这里测试几件事:

  1. 您的 GET 请求成功(或不成功)。
  2. 你得到有效的 JSON(或没有)。
  3. 你的记录没有被破坏。

您可能应该在稍高的水平上进行测试。例如,我会测试这个用户故事:

Given a record with some reasonable fixture data,
When the record is successfully retrieved
Then your application does something useful with it.
于 2012-07-09T17:46:36.573 回答
0

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

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

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

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

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

请记住,您正在查看有关该类的行为方式以及它为何有价值的示例,以便您可以记录它并使其易于理解。您正在使用它来帮助细化类的职责,以使其保持可维护性。这实际上与测试无关。

于 2012-07-09T23:51:02.593 回答
0

关于测试的事情是,你想要做到多彻底完全取决于你。在理想情况下,您将对应用程序的每个方面进行测试。鉴于您可能正在从事一个副项目,并且您的时间最好花在编写应用程序上,我认为只有基本的流程测试才能满足您的需求。

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

你没有提到你正在使用什么测试套件——如果你还没有任何想法,我会推荐 rspec。

希望有帮助,

里根

于 2012-07-09T17:41:26.993 回答