针对Die的一些方面的Rspec测试失败

时间:2015-09-21 16:46:35

标签: ruby rspec

Heys伙计们我是rspec的初学者。任何人都可以帮我解决这个问题。 我的测试returns the number of sides that the die possesses失败了,我做错了什么?

require 'rspec'
require_relative 'die'

describe Die do
  describe '#initialize' do
    it 'expects a single argument' do
      expect(Die.instance_method(:initialize).arity).to eq 1
    end

    it 'raises ArgumentError if sides are < 1' do
      expect {
        Die.new(-1)
      }.to raise_error(ArgumentError)

      expect {
        Die.new(0)
      }.to raise_error(ArgumentError)
    end
  end


  describe 'Instance method' do
    before(:each) do
      @sides = rand(50)
      @die = Die.new(@sides)
    end
    context '#num_of_sides' do
      it 'expects method to have no arguments' do
        expect(Die.instance_method(:num_of_sides).arity).to eq 0
      end
      it 'returns the number of sides that the die possesses' do
        expect(@die.num_of_sides).to eq @sides
      end
    end
    context "#roll" do
      it 'expects roll method to have no arguments' do
        expect(Die.instance_method(:roll).arity).to eq 0
      end
      it "returns a random number between 1 and number_of_sides" do
        rolls = Array.new(10000) {@die.roll}.uniq.sort
        possible_values = (1..@sides).to_a
        expect(rolls).to eq possible_values
      end
    end
  end
end

Ruby Die Class:

class Die
  def initialize(sides)
    raise ArgumentError if sides < 1
  end

  def num_of_sides(sides=nil)
    if sides!=nil
      Random.rand(50)
    else
      0
    end
  end

  def roll()
  end
end
  

输出:6个例子,2个失败,4个传递

1 个答案:

答案 0 :(得分:1)

您还没有实现Die类,因此它会记住它实例化的边数。

为此,您通常会使用实例变量,例如@num_of_sides,并将其设置为构造函数中的sides param, 后检查了有效输入。

要读取边数,您可以只返回@num_of_sides的值(更改现有方法要简单得多,不需要取任何参数,只需返回值即可已存储,无需测试/逻辑或随机性),或者您可以使用为您创建该方法的快捷attr_reader :num_of_sides

值得回顾一下你对Ruby实例变量的任何注释,因为这似乎是你需要掌握的东西。或者你可以看看这个it's marked as final