繁体   English   中英

Ruby RSPEC 测试

[英]Ruby RSPEC test

我想知道如何满足is_valid测试,我尝试了几种方法,但测试没有通过我必须在课堂上写的内容

require 'spec_helper'

RSpec.describe PixKey do
  subject(:pix_key) { described_class.new(key) }

  let(:key) { 'email@wesley.io' }

  describe '.new' do
    context 'with a valid key' do
      it { is_expected.to be_a(described_class) }

      it { is_expected.to be_valid }
    end

鳕鱼类

class PixKey

  attr_accessor :key

  def new(key)
    @key = :key
    validates :key, presence: true
  end

end

具有有效密钥的 PixKey .new 预计是一种 PixKey

  is expected to be valid (FAILED - 1)

我假设这是一个测试驱动开发 (TDD) 任务,您在其中获得了一些规范,并且必须实现一个通过测试的类。

为了使您的规范绿色,您必须实现一些方法。 为此,您必须了解 RSpec 的语法:

  • described_class - 这是describe之后的任何内容。 在您的规范中,它是describe PixKey ,所以described_class.new(key)等效于PixKey.new(key)
  • be_a是一个类型匹配器,相当于调用kind_of?
  • be_valid是一个谓词匹配器,相当于调用valid?

让我们从一个空类开始:

class PixKey
end

运行规范会出错:( --fail-fast使 RSpec 在第一个失败的规范后停止)

$ rspec pix_key_spec.rb --fail-fast

Failures:

  1) PixKey.new with a valid key
     Failure/Error: subject(:pix_key) { described_class.new(key) }

     ArgumentError:
       wrong number of arguments (given 1, expected 0)

❌ 1 example, 1 failure

RSpec 调用PixKey.new(key)new不带参数。 为了让它工作,你可以实现一个名为new的类方法,即:

class PixKey
  def self.new(key)
    allocate
  end
end

但是 Ruby 类已经带有一个为您处理分配的内置new方法。 您通常只需实现一个名为initialize的实例方法:

class PixKey
  def initialize(key)
  end
end

Ruby 的内置new将调用initialize并将所有参数传递给它。

请注意,我还没有对key做任何事情。 这是 TDD 的核心部分:您编写的代码足以让测试通过。 让我们再试一次:

$ rspec pix_key_spec.rb --fail-fast

Failures:

  1) PixKey.new with a valid key is expected to be valid
     Failure/Error: it { is_expected.to be_valid }
       expected #<PixKey:0x000000010201de90> to respond to `valid?`

❌ 2 examples, 1 failure

这一次,它抱怨我们的PixKey实例没有响应valid? ,所以让我们实现该方法:(尾随?是方法名称的一部分)

class PixKey
  def initialize(key)
  end

  def valid?
  end
end

并再次运行测试:

$ rspec pix_key_spec.rb --fail-fast

Failures:

  1) PixKey.new with a valid key is expected to be valid
     Failure/Error: it { is_expected.to be_valid }
       expected `#<PixKey:0x00000001027b1da0>.valid?` to be truthy, got nil

❌ 2 examples, 1 failure

现在它说我们的valid? 方法预计会返回一个“真实”的结果。 在 Ruby 中,除了nilfalse之外的所有内容都被认为是真实的,但我只使用true

class PixKey
  def initialize(key)
  end

  def valid?
    true
  end
end
$ rspec pix_key_spec.rb --fail-fast

✅ 2 examples, 0 failures

至此,规范通过了。 但显然,这个类还远未完成: key从未使用过且valid? 总是返回true而不验证任何内容。

我认为还有更多的测试要通过。 继续以小步骤工作,一次只进行一项测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM