用于存储正确答案的黄瓜数据表的步骤定义

Step definitions for cucumber data tables for storing correct answers

我正在尝试找到一种方法来测试多项选择题。其结构是一节课有 8 个阶段,每个阶段包含多项选择题,只有一个正确答案。每次加载问题都是随机的,所以我一直在寻找最好的方法来测试是否点击了正确答案。出于这个原因,我创建了一个包含两列的数据 table,这显然比这更广泛,但遵循这些原则:

| what is the opposite of true | false        |
| what comes after tuesday     |  wednesday   |

我在功能测试中写到它正在测试正确答案匹配。后来我希望找到一种方法来测试如果问题和答案匹配不在数据 table 中那么它是不正确的。有人能解释一下我将如何为此做测试定义吗?

我尝试使用 rows_hash 方法,但出现以下错误

 undefined method `rows_hash' for -3634850196505698949:Fixnum (NoMethodError)

Given(/^a list of answer\-value pairs$/) do |table|
    @question_answer_table = hash
end

When(/^I choose a match$/) do
  hash = @question_answer_table
  @question_answer_table.rows_hash
  return false if hash[question].nil?
  return hash[question] == answer
end

我觉得rows_hash方法对你有帮助。

def question_correct?(cucumber_table, question, answer)
  hash = cucumber_table.rows_hash
  return false if hash[question].nil?
  return hash[question] == answer
end

该代码通过将两列数据 table 转换为散列来工作,其中第一列是键,第二列是值。

请记住,此方法要求您的数据 table 限于两列。

如果您不尝试使用数据表在 Cucumber 中执行此操作,您会发现这要容易得多。相反,将所有这些细节下推到由步骤定义调用的辅助方法。要开始这样做,您需要编写一个更抽象的功能。

您需要做的第一件事是获得尽可能简单的课程。所以

Given a simple lesson
When I answer the questions correctly
Then I should see I passed the lesson

这是您将用于 'drive' 开发的场景。

您可以通过委托来真正轻松地实施这些步骤,例如

Given "a simple lesson" do
  @lesson = create_simple_lesson
end

When "I answer the questions correctly" do
  answer_questions lesson: @lesson
end

Then "I should see I passed the lesson" do
  expect(page).to have_content "You passed"
end

要使其正常工作,您必须实施一些辅助方法

module QuestionaireStepHelper
  def create_simple_lesson
    ...

  def answer_questions lesson: nil
    ...


end
World QuestionaireStepHelper

这样做是将您的技术问题转移到一个新领域。在这里,您可以使用编程语言的全部功能来做任何您想做的事情:所以您可以做

  • 创建有答案的问题并知道正确答案是什么
  • 问他们正确答案的问题,这样你就可以正确回答他们
  • 向课程中添加问题 ...

记住,因为你还在Cucumber::World,你拥有

的全部权力
  • 驱动您的浏览器
  • 访问您的数据库 ...

当你完成这个后,你将有很多工具来编写像

这样的场景
Given a simple lesson
When I answer the questions incorrectly
Then I should see I failed the lesson

等等。