【问题标题】:RSpec Expectations and ExpectationNotMetErrorRSpec 期望和 ExpectationNotMetError
【发布时间】:2015-01-25 15:11:25
【问题描述】:

您好,我一直在学习一门课程以进一步了解黄瓜。这门课有点老了,所以我不得不从应该期望的地方更新一些 rspec 语法,但除此之外一直非常仔细地遵循它。我无法通过最近的测试,我不知道为什么。我收到的错误如下。我知道它应该收到 95 时收到 nil,但我仍然不明白为什么。

When They submitted an assignment    # features/step_definitions/teacher_grade_assignment.rb:6
    Then the assignment has a grade      # features/step_definitions/teacher_grade_assignment.rb:14

      expected: 95
           got: nil

      (compared using ==)
       (RSpec::Expectations::ExpectationNotMetError)
      ./features/step_definitions/teacher_grade_assignment.rb:15:in `/^the assignment has a grade$/'
      features/teacher_can_grade_assignment.feature:11:in `Then the assignment has a grade'

Failing Scenarios:
cucumber features/teacher_can_grade_assignment.feature:7 # Scenario: Teacher can grade assignment

teacher_grade_assignment.rb

Given(/^I have a student$/) do
    @teacher = Teacher.new
    @student = Student.new
end

Given(/^They submitted an assignment$/) do
  @teacher.submit_assignment(@student, Assignment.new)
end

When(/^I grade the assignment$/) do
  @teacher.record_grade(@student, 95)
end

Then(/^the assignment has a grade$/) do
    expect(@teacher.assignment_for_student(@student).grade).to eq(95)
end

student_assignment_steps.rb

Given(/^I am a student$/) do
  @student = Student.new #setting as an instance variable to access later on
  @teacher = Teacher.new
end

When(/^I submit an assignment to my teacher$/) do
    @assignment = Assignment.new
    @teacher.submit_assignment(@student, @assignment)
end

Then(/^my teacher should have my assignment$/) do
    expect(@teacher.assignment_for_student(@student)).to eq(@assignment)
end

teacher.rb

class Teacher 
    def initialize
        @assignments = {}
    end

    def record_grade(student, grade)
        assignment = @assignments[student] #assignment equal to assignments of the student
        assignment.grade = grade 
        @assignments[student] = assignment
    end 

    def submit_assignment(student, assignment)
        @assignments[student] = assignment
    end

    def assignment_for_student(student)
        @assignments[student]
    end
end

teacher_spec.rb

require_relative "../lib/teacher"
require "rspec"

describe Teacher do 
    it "should store assignments" do
        student = double
        assignment = double
        subject.submit_assignment(student, assignment)
        expect(subject.assignment_for_student(student)).to eq(assignment)
    end

describe "should record a grade" do 
    it "should record and the grade" do 
        student = double
        assignment = double
        expect(assignment).to receive(:grade=).with(95)
        subject.submit_assignment(student, assignment)
        subject.record_grade(student, 95)
    end
end
end

assignment_spec.rb

require_relative "../lib/assignment"

describe Assignment do 
    it "should store a grade" do 
        subject.grade = 60
        expect(subject.grade).to eq(60)
    end 
end 

assignment.rb

class Assignment
    attr_accessor :grade
end

student.rb

class Student
end

teacher_can_grade_assignment.feature

Feature: Teacher can grade assignment

    As a Teacher
    I can grade my students' assignments
    So that they can know their knowledge level

    Scenario: Teacher can grade assignment
        Given I have a student
        And They submitted an assignment
        When They submitted an assignment
        Then the assignment has a grade

【问题讨论】:

  • 您遗漏了一段重要的代码,即驱动步骤的功能。你能补充一下吗?至少是第 11 行附近的场景。

标签: ruby rspec cucumber rspec-expectations


【解决方案1】:

你的作业没有评分,因为老师从来没有给它评分:你的功能不叫“我给作业评分”

【讨论】:

    【解决方案2】:

    您的测试告诉您@teacher.assignment_for_student(@student).gradenil。不知何故,它没有正确设置。正如您所说,这是出乎意料的,您预计它是 95。

    在 TDD 中,最好的下一步是找出失败测试中的更多状态。

    添加一些额外的(临时)期望以查看您的对象在失败步骤中的状态:

    expect(@teacher.assignment_for_student(@student)).to eq(@assignment)
    expect(@teacher.class_variable_get(:@assigments).to include(@assignment)
    

    即使是您确定会失败的测试通常也会有很大帮助。

    expect(@teacher.assignment_for_student(@student)).to be "failure"
    

    通过在您的步骤周围散布此类期望,您可以调试状态并查看代码集成错误的位置。

    从您粘贴的代码中,我没有立即发现代码有任何问题。

    【讨论】:

    • 谢谢,我还添加了附加代码,但会看得更深!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多