Ruby on rails 如何为其(:字段)定义Rspec自定义匹配器

Ruby on rails 如何为其(:字段)定义Rspec自定义匹配器,ruby-on-rails,ruby-on-rails-3,macros,rspec,Ruby On Rails,Ruby On Rails 3,Macros,Rspec,我想为RSpec2声明自定义匹配器 我使用的是RSPEC2.13和rails 3.2.13 我曾尝试写过这样的东西: RSpec::Matchers.define :be_present do |expected| match do expected !be_empty end end its(:from) { should_not be_nil } 但是当我在规范中使用它时,它不起作用 失败: 1) NewsletterMailer.send_newsletter_to

我想为RSpec2声明自定义匹配器

我使用的是RSPEC2.13和rails 3.2.13

我曾尝试写过这样的东西:

RSpec::Matchers.define :be_present do |expected|
  match do
    expected !be_empty
  end
end
its(:from) { should_not be_nil }
但是当我在规范中使用它时,它不起作用 失败:

  1) NewsletterMailer.send_newsletter_to_groups from 
     Failure/Error: its(:from) { should be_present }
     ArgumentError:
       wrong number of arguments (1 for 0)
规格代码:

describe NewsletterMailer do

  describe '.send_newsletter_to_emails' do
    let(:user) { create(:admin) }
    let(:user2) { create(:user) }
    subject { NewsletterMailer.send_newsletter_to_emails(newsletter.id, "#{user.email}, #{user2.email}") }

    its(:to) { should == [user.email, user2.email] }
    its(:from) { should be_present }
    its(:subject) { should be }
  end
编辑:

我想有这样的逻辑的相反:

RSpec::Matchers.define :be_present do |expected|
  match do
    expected !be_empty
  end
end
its(:from) { should_not be_nil }
解决方案:

RSpec::Matchers.define :be_present do |expected|
  match do |actual|
    actual && actual.present?
  end
end
看起来Rspec中已经存在此帮助程序

我只是重新发明了轮子。但我还是会给出这个答案,不会删除这个帖子

这将是开发人员的提示,如何声明没有参数的自定义匹配器,例如

有什么特别的解决方案:

RSpec::Matchers.define :be_present do |expected|
  match do |actual|
    actual && actual.present?
  end
end
看起来Rspec中已经存在此帮助程序

我只是重新发明了轮子。但我还是会给出这个答案,不会删除这个帖子

这将是开发人员的提示,如何声明没有参数的自定义匹配器,例如


做点特别的事吧

我不知道你为什么在这里需要一个定制的匹配器。不会

its:from{should}

为你工作

请看这里:

如果obj不为零,则obj应为通过

更新:

由于问题显然是如何为现有谓词present编写自定义匹配器,那么答案是:rspec已经提供了这一功能,并且仍然没有必要编写自定义匹配器


对于任何谓词foo?在一个对象上,您可以只写should\u foo。Rspec甚至会为以has like\u foo开头的谓词定义匹配器?使用更自然的语法,这样您就可以直接编写了。我不知道您为什么需要自定义匹配器。不会

its:from{should}

为你工作

请看这里:

如果obj不为零,则obj应为通过

更新:

由于问题显然是如何为现有谓词present编写自定义匹配器,那么答案是:rspec已经提供了这一功能,并且仍然没有必要编写自定义匹配器


对于任何谓词foo?在一个对象上,您可以只写should\u foo。Rspec甚至会为以has like\u foo开头的谓词定义匹配器?使用更自然的语法,这样您就可以只写应该有_-foo。

这只会在存在时起作用吗?是定义的,如果是这种情况,那么rspec的内置谓词匹配器将已经提供一个be_present匹配器?助手不可用,您可以执行以下操作:实际&&!真的,空的?哈哈,你说得对。Rspec已经提供了这个匹配器,看起来我复制了代码:数据只有在存在的情况下才能工作?是定义的,如果是这种情况,那么rspec的内置谓词匹配器将已经提供一个be_present匹配器?助手不可用,您可以执行以下操作:实际&&!真的,空的?哈哈,你说得对。Rspec已经提供了这个匹配器,看起来我复制了代码:d这将只检查字段是否不是nil。string的size==0,返回true。这是正确的,但您说过希望的行为不应为null,对吗?如果您的意思是希望检查它是否为非nil且长度大于0,并且如果您使用Rails,则可以执行以下操作:from{should_not be_blank},这将仅检查字段是否为非nil。string的size==0,返回true。这是正确的,但您说过希望的行为不应为null,对吗?如果您的意思是要检查它是否为非nil且长度大于0,并且如果您使用的是Rails,那么您可以执行以下操作:from{should_not be_blank}