2015-01-25 1 views
0

Здравствуйте, я слежу за курсом, чтобы понять мое понимание огурца. Курс немного старый, поэтому мне пришлось обновить некоторый синтаксис rspec, который должен был ожидать, но в противном случае внимательно следили за ним. Я не могу пройти этот последний тест, и я довольно потерял, почему. Ошибка, которую я получаю, ниже. Я понимаю, что он получает ноль, когда он должен получать 95, но я до сих пор не понимаю, почему.RSpec Ожидания и ожиданияNotMetError

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 
+0

Вы что пропущены важной частью коды, функция, подпитывающие шаги. Можете ли вы добавить это?По крайней мере, сценарий вокруг строки 11. – berkes

ответ

1

Вашего задание не имеет класса, потому что учитель никогда не градуированный его: ваша функция не называет «I степени шага назначения»

1

Ваши тесты говорят вам, что @teacher.assignment_for_student(@student).grade является nil. Как-то он настроен неправильно. Это неожиданно, поскольку вы заявляете, что вы ожидали, что это будет 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" 

Пользуясь такими ожиданиями вокруг своих шагов, вы можете отлаживать состояние и видеть, где код интегрирован неправильно.

Из вашего вставленного кода я не вижу ничего плохого в коде немедленно.

+0

спасибо, я также добавил дополнительный код, но посмотрю глубже! – Lilp