E1850 Write unit tests for review response map
Expertiza
It is an open source software created by North Carolina State University's students. It works on ruby on rails framework. This platform allows instructor to post notification about tests and assignments and also allows students to view grades, submit assignments, find teammates etc.
Background
Review_response_map.rb file is a newly added feature in Expertiza. The ReviewResponseMap class in the file is the sub class of ResponseMap class.The file review_response_map.rb deals with mapping of review's review to the feedback that reviewee gives to that review. Since the file is new it is not tested. We have worked on the file review_response_map_spec.rb which use RSpec framework to perform unit testing on the given file.
Problem Statement
1.Create a new file named review_response_map_spec.rb under spec/models folder
2.Write RSpec unit tests to make the path coverage above 90%.
3.Coverage as many edge cases as you can.
4.Achieve as high branch coverage as you can. We will use the mutant-rspec gem to measure test thoroughness and fault-finding capability of your tests.
Test Plan
We created the following stubs to implement unit testing:
let(:participant) { build(:participant, id: 1, parent_id: 1, user: build(:student, name: 'no name', fullname: 'no one')) } let(:participant2) { build(:participant, id: 2, parent_id: 1, user: build(:student, name: 'no name', fullname: 'no one')) } let(:student){ build(:participant, id: 3, parent_id: 1, user: build(:student, name: 'no name', fullname: 'first user')) } let(:student2){ build(:participant, id: 4, parent_id: 1, user: build(:student, name: 'no name', fullname: 'second one')) } let(:team) { build(:assignment_team) } let(:assignment) { build(:assignment, id: 1, name: 'Test Assgt') } let(:assignment2) { build(:assignment, id: 2, name: 'Test Assgt') } let(:response_map) { build(:review_response_map, reviewer: student, response: [response], reviewee_id: 1, type: "ReviewResponseMap") } let(:response_map2) { build(:review_response_map, reviewer: student2, response:[response2, response3],reviewee_id: 1, type: "ReviewResponseMap") } let(:question) { Criterion.new(id: 1, weight: 2, break_before: true) } let(:questionnaire) { ReviewQuestionnaire.new(id: 1, questions: [question], max_question_score: 5) } let(:answer) { Answer.new(answer: 1, comments: 'Answer text', question_id: 1) } let(:response) { build(:response, id: 1, round: 1, is_submitted: true,map_id: 1, scores: [answer]) } let(:response2) { build(:response, id: 2, round: 1, is_submitted: true, map_id: 1, scores: [answer]) } let(:response3) { build(:response, id: 3, round: 1, is_submitted: false, map_id: 1, scores: [answer]) } let(:review_response_map) { build(:review_response_map, reviewer_id:1, assignment: assignment, reviewer: participant, reviewee: team) } let(:review_response_map2) { build(:review_response_map, assignment: assignment2, reviewer: participant2, reviewee: team) } let(:meta_review_response_map) { build(:meta_review_response_map, review_mapping: review_response_map, reviewee: participant)} let(:feedback_response_map){ build(:review_response_map, reviewed_object_id: 1, response:[response2], type:'FeedbackResponseMap')}
Implementation
The get_title method
describe '#get_title' do it 'returns the title' do expect(review_response_map.get_title).to eql("Review") end end
The questionnaire method
describe '#questionnaire' do it 'returns questionnaire' do allow(assignment).to receive(:review_questionnaire_id).and_return(1) allow(Questionnaire).to receive(:find_by).with(id: 1).and_return(questionnaire) expect(review_response_map.questionnaire.id).to eq(1) end end
The export_fields method
describe '.export_fields' do it 'returns list of strings "contributor" and "reviewed by"' do expect(ReviewResponseMap.export_fields "").to eq(["contributor", "reviewed by"]) end end
The delete method
describe '#delete' do it 'deletes the review response map' do allow(review_response_map.response).to receive(:response_id).and_return(1) allow(FeedbackResponseMap).to receive(:where).with(reviewed_object_id: 1).and_return([feedback_response_map]) allow(feedback_response_map).to receive(:delete).with(nil).and_return(true) allow(MetareviewResponseMap).to receive(:where).with(reviewed_object_id: review_response_map.id).and_return([meta_review_response_map]) allow(meta_review_response_map).to receive(:delete).with(nil).and_return(true) allow(review_response_map).to receive(:destroy).and_return(true) expect(review_response_map.delete).to be true end end
The get_responses_for_team_round method
describe '.get_responses_for_team_round' do context 'when team doesnt exist' do it 'returns empty response' do team = instance_double('AssignmentTeam').as_null_object allow(team).to receive(:id).and_return(false) expect(ReviewResponseMap.get_responses_for_team_round team, 1).to eql([]) end end context 'when team exists' do it 'returns the responses for particular round' do team = instance_double('AssignmentTeam', :id=>1) round = 1 allow(ResponseMap).to receive(:where).with(reviewee_id: 1, type: "ReviewResponseMap").and_return([response_map, response_map2]) expect(ReviewResponseMap.get_responses_for_team_round(team, round).length).to eql(2) end end end
The show_feedback method
describe '#show_feedback' do context 'when no response is present or response is nil' do it 'returns nil' do db1 = instance_double("Response").as_null_object expect(review_response_map.show_feedback db1).to be(nil) end end end end
Files affected
review_response_map.rb review_response_map_spec.rb spec_helper.rb
Testing Framework
We used RSpec framework to test the given file.RSpec is a 'Domain Specific Language' (DSL) testing tool written in Ruby to test Ruby code.It is a behavior-driven development (BDD) framework which is extensively used in the production applications. The basic idea behind this concept is that of Test Driven Development (TDD) where the tests are written first and the development is based on writing just enough code that will fulfill those tests followed by refactoring. It contains its own mocking framework that is fully integrated into the framework based upon JMock.The simplicity in the RSpec syntax makes it one of the popular testing tools for Ruby applications. The RSpec tool can be used by installing the rspec gem which consists of 3 other gems namely rspec-core, rspec-expectation and rspec-mock.