RSpec 单行测试对象属性

问题描述 投票:0回答:3

我们假设以下情况

class A
    attr_accessor :name
    def initialize(name)
        @name = name
    end
end

subject { A.new('John') }

那么我想要一些这样的台词

it { should have(:name) eq('John') }

有可能吗?

ruby rspec
3个回答
13
投票

方法 its 已从 RSpec https://gist.github.com/myronmarston/4503509 中删除。相反,您应该能够以这种方式完成单行:

it { is_expected.to have_attributes(name: 'John') }

5
投票

是的,这是可能的,但是您要使用的语法(到处使用空格)意味着

have(:name)
eq('John')
都是应用于方法
should
的参数。所以你必须预先定义这些,这不能成为你的目标。也就是说,您可以使用 rspec 自定义匹配器 来实现类似的目标:

require 'rspec/expectations'

RSpec::Matchers.define :have do |meth, expected|
  match do |actual|
    actual.send(meth) == expected
  end
end

这将为您提供以下语法:

it { should have(:name, 'John') }

此外,您还可以使用

its

its(:name){ should eq('John') }

4
投票
person = Person.new('Jim', 32)

expect(person).to have_attributes(name: 'Jim', age: 32)

参考:rspec has-attributes-matcher

© www.soinside.com 2019 - 2024. All rights reserved.