Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 编写RSpec测试/示例的最佳实践是什么?写一些例子来测试肯定/肯定、否定或两者?_Ruby On Rails 3_Bdd_Rspec2_Rspec Rails - Fatal编程技术网

Ruby on rails 3 编写RSpec测试/示例的最佳实践是什么?写一些例子来测试肯定/肯定、否定或两者?

Ruby on rails 3 编写RSpec测试/示例的最佳实践是什么?写一些例子来测试肯定/肯定、否定或两者?,ruby-on-rails-3,bdd,rspec2,rspec-rails,Ruby On Rails 3,Bdd,Rspec2,Rspec Rails,对于BDD和RSpec来说是相当陌生的,我真的很好奇人们在编写RSpec测试/示例时通常会做什么,特别是当它涉及到同一事物的阳性和阴性测试时 以用户名验证和有效用户名仅包含字母数字字符的规则为例 肯定/肯定测试如下: it "should be valid if it contains alphanumeric characters" username = 'abc123' username.should be_valid end it "should be invalid if it

对于BDD和RSpec来说是相当陌生的,我真的很好奇人们在编写RSpec测试/示例时通常会做什么,特别是当它涉及到同一事物的阳性和阴性测试时

以用户名验证和有效用户名仅包含字母数字字符的规则为例

肯定/肯定测试如下:

it "should be valid if it contains alphanumeric characters"
  username = 'abc123'
  username.should be_valid
end
it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid
end
而阴性测试是这样的:

it "should be valid if it contains alphanumeric characters"
  username = 'abc123'
  username.should be_valid
end
it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid
end
你会写一个测试,而不是另一个吗?你两个都写吗?你能把它们放在同一个测试中吗?我见过人们做上述任何一项的例子,所以我想知道是否有最佳实践,如果有,是什么

编写阳性和阴性测试的示例:

it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid

  username = 'abc123'
  username.should be_valid
end

我见过这样做的例子,但老实说,我不喜欢这种方法。我倾向于只为了一个目的而保持事物的干净和清晰,就像我们应该如何编写方法一样,因此我更可能编写两个单独的测试,而不是将它们放在一个测试中。那么,有没有一种最佳实践可以说明这种情况?这些例子应该从一个角度,而不是所有角度来测试一个单一的特性/行为。

在这种情况下,我会将它们写为正面和负面。这是因为您确实希望确保允许具有有效用户名的人拥有这些用户名,而试图拥有无效用户名的人不能这样做

同样,如果一个应该/不应该有效的用户名与应该有效的用户名相反,那么您已经进行了这些测试,只需在测试的正确类别中添加一个失败的测试,确认测试确实失败,修复它,然后确认测试通过即可


所以,是的,在这种情况下,测试两者。不仅仅是一个或另一个。

这种模式通常被称为“每个测试一个断言”:


我发现在任何情况下,这都有助于认识到您所做的并不是真正的测试。您提供了如何/为什么使用该类的示例以及对其行为的一些描述。如果您需要不止一个示例来锚定有价值的行为,我认为可以同时包含这两个示例

例如,如果我描述一个列表的行为,我会有两个例子来描述“列表应该告诉我它是否为空”。无论是空洞的例子还是完整的例子本身都没有价值

另一方面,如果您有一个默认情况,其中某些内容是有效的,然后是一些例外情况,那么“有效”情况是独立有价值的。您以后可能会发现其他情况,例如:

  • 应该对非字母数字无效
  • 对于已使用的名称,应无效
  • 应仅对数字无效
  • 应适用于重音字母
等等

在这种情况下,你的行为有两个巧合的例子,而不是因为它们构成了行为的两个方面。有效的行为本身是有价值的。因此,在本例中,每个测试有一个示例,但通常每个测试有一个方面的行为

这也适用于其他非布尔行为。例如,如果我在写ATM软件,我想同时提供现金和借记账户。没有另一种行为,两种行为都没有价值


“每个测试一个断言”是一个很好的经验法则。我发现它可能会被过度使用,有时会出现“每个测试一个方面的行为”的情况。这不是那种情况,但我认为值得一提。

谢谢您的回复。我想知道你对在同一个例子中写积极和消极测试有什么想法。我见过这样做的例子,但老实说,我不喜欢这种方法。我倾向于只为了一个目的而保持事物的干净和清晰,就像我们应该如何编写方法一样,因此我更可能编写两个单独的测试,而不是将它们放在一个测试中。那么,有没有一种最佳实践可以说明这种情况?示例应该从一个角度测试单个特性/行为,而不是从所有角度。