ruby-on-rails Rspec如何stub模块的示例方法?

pjngdqdw  于 2023-08-08  发布在  Ruby
关注(0)|答案(3)|浏览(109)

B看起来像:

module A
   module B

     def enabled? xxx
        xxx == 'a'
     end

     def disabled? xxx
       xxx != 'a'
     end
   end
end

字符串
另一个C.rb像:

module YYY
  class C
  include A::B

  def a_method 
     if(enabled? xxx) 
       return 'a'
     return 'b'
  end
end


现在我想写单元测试来测试一个_method函数

describe :a_method do
    it 'returns a' do
       ###how to sub enabled? method to make it return true....
    end
 end


enabled?是模型中的示例方法,我试过了

A::B.stub.any_instance(:enabled).and_return true


不能用。
谁能帮帮我????

piwo6bdm

piwo6bdm1#

你打错了。你的A::B是一个模块,所以你没有示例,示例是类的。你也忘了问号。
尝试这样做来stub你的模块静态方法:

A::B.stub(:enabled?).and_return true

字符串
在第二个例子中(如果你需要),试试这个:

YYY::C.any_instance.stub(:a_method).and_return something


但是我认为你试图在类YYY::C中存根enabled?方法,所以你需要使用这个:

YYY::C.any_instance.stub(:enabled?).and_return true


然后当调用:a_method时,enabled?将返回true。

xmakbtuz

xmakbtuz2#

您应该能够在要创建示例的类上存根方法。例如

class Z
   include YYY
end

describe Z do
  describe "Z#a_method" do
    let(:z) { Z.new }
    it 'returns a' do
      expect(z).to receive(:enabled?).and_return(true)
      expect(z.a_method).to eq('a')
    end
  end
end

字符串
或类似的...

b91juud3

b91juud33#

这是一个老问题,但在搜索rspec rails stub a method时仍然会弹出。
尽管allow_any_instance_ofexpect_any_instance_of都可以在这种情况下工作,但由于多种原因,这被认为是有问题的代码。
我在实现@Taryn的答案时遇到了困难,但我的问题是如何声明测试示例。

class Z
   include YYY
end

def outer_test
   Z.new
end

describe Z do

  def inner_test
     Z.new
  end

  # this passes
  describe "Z#a_method" do
    let(:z) { Z.new }
    it 'returns a' do
      expect(z).to receive(:enabled?).and_return(true)
      expect(z.a_method).to eq('a')
    end
  end

  # these will not
  describe "Z#a_method" do
    it 'returns a' do
      expect(outer_test).to receive(:enabled?).and_return(true)
      expect(outer_test.a_method).to eq('a')
    end
  end

  describe "Z#a_method" do
    it 'returns a' do
      expect(inner_test).to receive(:enabled?).and_return(true)
      expect(inner_test.a_method).to eq('a')
    end
  end

end

字符串
我需要小心地确保测试类示例声明是在let块中完成的,这样才能使这种类型的存根成功。但是allow_any_instance_ofexpect_any_instance_of都允许那些失败的测试通过。

相关问题