如何在RSpec中存根?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在RSpec中存根?相关的知识,希望对你有一定的参考价值。

我无法弄清楚为什么存根不能在这个源中创建。我正在尝试测试if语句中的逻辑。 if user.nil? || company.nil?是条件。为此,我制定了如下定义。

  def introduce
    accountant_request = AccountantRequest.with_introduce_request_status(:requested).find(params[:id])

    company = Company.find_by(id: accountant_request.company_id)
    user    = User.find_by(id: company.try(:primary_user_id))
    if user.nil? || company.nil?
      redirect_to admin_accountant_requests_path, alert: 'There is no company or user' and return
    end

这是规格。我的期望是Company.find_by(...)返回nil。

  shared_examples 'post #introduce' do
    subject(:response) { post 'introduce', params_for_introduce }

    context 'error by user.nil? || company.nil?' do
      it 'fail' do
        allow_any_instance_of(Company).to receive(:find_by).and_return(nil)
        expect(response).to have_http_status 302
        expect(response).to redirect_to introduce_error_redirect_path2
      end
    end

不幸的是,company = Company.find_by(id: accountant_request.company_id)返回现有记录不是零。所以我无法检查内部if语句。

怎么了?在这种情况下我该怎么办?欢迎任何想法。

答案

allow_any_instance_of应该用于Company类的实例,但是在这里调用find_by

试试这个(在执行测试主题之前,即请求):

allow(Company).to receive(:find_by) { nil }

以上是关于如何在RSpec中存根?的主要内容,如果未能解决你的问题,请参考以下文章

存根 rspec and_raise 并添加一条消息

在 rspec 中为 API 规范存根protect_from_forgery

无法使用 rspec 存根辅助方法

Rspec 模拟和存根与期望混淆

有没有办法用 Rspec 存根包含模块的方法?

RSpec 存根方法可以按顺序返回不同的值吗?