From 7d31a93e8cec421abfbf96f0fe17f58ecb63aa83 Mon Sep 17 00:00:00 2001 From: jason perez Date: Tue, 31 Dec 2013 08:45:58 -0800 Subject: [PATCH 1/3] add new feature: teacher can view average grade --- .gitignore | 1 + .../teacher_average_grade_steps.rb | 22 ++++++++++++++++ ...t.rb => teacher_grade_assignment_steps.rb} | 0 .../teacher_can_view_average_grade.feature | 11 ++++++++ lib/teacher.rb | 4 +++ spec/teacher_spec.rb | 26 ++++++++++++++++--- 6 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 features/step_definitions/teacher_average_grade_steps.rb rename features/step_definitions/{teacher_grade_assignment.rb => teacher_grade_assignment_steps.rb} (100%) create mode 100644 features/teacher_can_view_average_grade.feature diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4cde7c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.rspec \ No newline at end of file diff --git a/features/step_definitions/teacher_average_grade_steps.rb b/features/step_definitions/teacher_average_grade_steps.rb new file mode 100644 index 0000000..406a2a6 --- /dev/null +++ b/features/step_definitions/teacher_average_grade_steps.rb @@ -0,0 +1,22 @@ +Given /^I have multiple students$/ do + @teacher = Teacher.new + @student1 = Student.new + @student2 = Student.new + @student3 = Student.new +end + +Given /^each one has submitted an assignment$/ do + @teacher.submit_assignment(@student1, Assignment.new) + @teacher.submit_assignment(@student2, Assignment.new) + @teacher.submit_assignment(@student3, Assignment.new) +end + +When /^I give the assignments a grade$/ do + @teacher.record_grade(@student1, 95) + @teacher.record_grade(@student2, 50) + @teacher.record_grade(@student3, 80) +end + +Then /^I can view the average grade for my class$/ do + @teacher.average_grade.should eq(75) +end \ No newline at end of file diff --git a/features/step_definitions/teacher_grade_assignment.rb b/features/step_definitions/teacher_grade_assignment_steps.rb similarity index 100% rename from features/step_definitions/teacher_grade_assignment.rb rename to features/step_definitions/teacher_grade_assignment_steps.rb diff --git a/features/teacher_can_view_average_grade.feature b/features/teacher_can_view_average_grade.feature new file mode 100644 index 0000000..cdc351d --- /dev/null +++ b/features/teacher_can_view_average_grade.feature @@ -0,0 +1,11 @@ +Feature: Teacher can view average grade for the class + + As a Teacher + I can view the average grade for my class + So I can establish a grading curve + + Scenario: Teacher can view average grade for the class + Given I have multiple students + And each one has submitted an assignment + When I give the assignments a grade + Then I can view the average grade for my class diff --git a/lib/teacher.rb b/lib/teacher.rb index d68ffe9..8f3de0f 100644 --- a/lib/teacher.rb +++ b/lib/teacher.rb @@ -9,6 +9,10 @@ def record_grade(student, grade) @assignments[student] = assignment end + def average_grade + 76 + end + def submit_assignment(student, assignment) @assignments[student] = assignment end diff --git a/spec/teacher_spec.rb b/spec/teacher_spec.rb index 66894cc..2bb8e2f 100644 --- a/spec/teacher_spec.rb +++ b/spec/teacher_spec.rb @@ -3,8 +3,8 @@ describe Teacher do it "should store assignments" do - student = stub - assignment = stub + student = double + assignment = double subject.submit_assignment(student, assignment) subject.assignment_for_student(student).should eq(assignment) end @@ -12,11 +12,29 @@ describe "should record a grade" do it "should record the grade" do - student = stub - assignment = mock + student = double + assignment = double assignment.should_receive(:grade=).with(95) subject.submit_assignment(student, assignment) subject.record_grade(student, 95) end end + + describe "should provide an average grade for the class" do + it "should provide an average grade" do + student1 = double + student2 = double + student3 = double + assignment = double("assignment") + assignment.stub(:grade=) + subject.submit_assignment(student1, assignment) + subject.submit_assignment(student2, assignment) + subject.submit_assignment(student3, assignment) + subject.record_grade(student1, 95) + subject.record_grade(student2, 50) + subject.record_grade(student3, 80) + + subject.average_grade.should eq(75) + end + end end From a5e7535c2c53590bf0216e7b5501e267c4e72fc3 Mon Sep 17 00:00:00 2001 From: jason perez Date: Tue, 31 Dec 2013 16:32:22 -0800 Subject: [PATCH 2/3] complete average grade feature, need to refactor test --- lib/teacher.rb | 7 ++++++- spec/teacher_spec.rb | 26 +++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/teacher.rb b/lib/teacher.rb index 8f3de0f..162cbe4 100644 --- a/lib/teacher.rb +++ b/lib/teacher.rb @@ -10,7 +10,12 @@ def record_grade(student, grade) end def average_grade - 76 + sum_of_class_grades = 0 + number_of_students_in_the_class = @assignments.count + @assignments.each do |student, assignment| + sum_of_class_grades += assignment.grade + end + sum_of_class_grades / number_of_students_in_the_class end def submit_assignment(student, assignment) diff --git a/spec/teacher_spec.rb b/spec/teacher_spec.rb index 2bb8e2f..677a8b3 100644 --- a/spec/teacher_spec.rb +++ b/spec/teacher_spec.rb @@ -22,17 +22,21 @@ describe "should provide an average grade for the class" do it "should provide an average grade" do - student1 = double - student2 = double - student3 = double - assignment = double("assignment") - assignment.stub(:grade=) - subject.submit_assignment(student1, assignment) - subject.submit_assignment(student2, assignment) - subject.submit_assignment(student3, assignment) - subject.record_grade(student1, 95) - subject.record_grade(student2, 50) - subject.record_grade(student3, 80) + student1 = double + student2 = double + student3 = double + assignment1 = double("assignment 1") + assignment2 = double("assignment 2") + assignment3 = double("assignment 3") + assignment1.stub(:grade=) + assignment2.stub(:grade=) + assignment3.stub(:grade=) + assignment1.stub(:grade) { 95 } + assignment2.stub(:grade) { 50 } + assignment3.stub(:grade) { 80 } + subject.submit_assignment(student1, assignment1) + subject.submit_assignment(student2, assignment2) + subject.submit_assignment(student3, assignment3) subject.average_grade.should eq(75) end From 107b78cc679a37c82338f0c2916c608cce215666 Mon Sep 17 00:00:00 2001 From: Jason Perez Date: Fri, 3 Jan 2014 14:55:59 -0800 Subject: [PATCH 3/3] update average grade code, update average grade test --- Gemfile.lock | 3 +++ .../teacher_average_grade_steps.rb | 2 +- lib/teacher.rb | 13 +++++------ spec/teacher_spec.rb | 23 +++++-------------- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f74d46d..2eb7fe0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,6 +10,8 @@ GEM diff-lcs (1.1.3) gherkin (2.10.0) json (>= 1.4.6) + gherkin (2.10.0-x86-mingw32) + json (>= 1.4.6) json (1.7.3) rack (1.4.1) rspec (2.10.0) @@ -23,6 +25,7 @@ GEM PLATFORMS ruby + x86-mingw32 DEPENDENCIES cucumber diff --git a/features/step_definitions/teacher_average_grade_steps.rb b/features/step_definitions/teacher_average_grade_steps.rb index 406a2a6..aab1052 100644 --- a/features/step_definitions/teacher_average_grade_steps.rb +++ b/features/step_definitions/teacher_average_grade_steps.rb @@ -18,5 +18,5 @@ end Then /^I can view the average grade for my class$/ do - @teacher.average_grade.should eq(75) + @teacher.average_grade(@teacher.assignments).should eq(75) end \ No newline at end of file diff --git a/lib/teacher.rb b/lib/teacher.rb index 162cbe4..6799788 100644 --- a/lib/teacher.rb +++ b/lib/teacher.rb @@ -1,4 +1,6 @@ class Teacher + attr_reader :assignments + def initialize @assignments = {} end @@ -9,13 +11,10 @@ def record_grade(student, grade) @assignments[student] = assignment end - def average_grade - sum_of_class_grades = 0 - number_of_students_in_the_class = @assignments.count - @assignments.each do |student, assignment| - sum_of_class_grades += assignment.grade - end - sum_of_class_grades / number_of_students_in_the_class + def average_grade(assignments) + class_grades = assignments.map { |student, assignment| assignment.grade } + sum_of_class_grades = class_grades.inject(:+) + sum_of_class_grades / assignments.size end def submit_assignment(student, assignment) diff --git a/spec/teacher_spec.rb b/spec/teacher_spec.rb index 677a8b3..ab693c8 100644 --- a/spec/teacher_spec.rb +++ b/spec/teacher_spec.rb @@ -22,23 +22,12 @@ describe "should provide an average grade for the class" do it "should provide an average grade" do - student1 = double - student2 = double - student3 = double - assignment1 = double("assignment 1") - assignment2 = double("assignment 2") - assignment3 = double("assignment 3") - assignment1.stub(:grade=) - assignment2.stub(:grade=) - assignment3.stub(:grade=) - assignment1.stub(:grade) { 95 } - assignment2.stub(:grade) { 50 } - assignment3.stub(:grade) { 80 } - subject.submit_assignment(student1, assignment1) - subject.submit_assignment(student2, assignment2) - subject.submit_assignment(student3, assignment3) - - subject.average_grade.should eq(75) + assignment_doubles = { + student1: double("Assignment", grade: 95), + student2: double("Assignment", grade: 50), + student3: double("Assignment", grade: 80) + } + subject.average_grade(assignment_doubles).should eq(75) end end end