0

您好,我一直在学习一门课程以进一步了解黄瓜。这门课有点老了,所以我不得不从应该期望的地方更新一些 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

教师等级分配.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

老师.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

教师规范.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 

赋值.rb

class Assignment
    attr_accessor :grade
end

学生.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
4

2 回答 2

2

您的作业没有评分,因为老师从未给它评分:您的功能没有调用“我为作业评分”步骤

于 2015-01-25T18:05:48.847 回答
1

你的测试告诉你那@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"

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

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

于 2015-01-25T15:28:07.660 回答