控制器方法的写入测试

时间:2014-07-30 19:54:41

标签: ruby ruby-on-rails-3 minitest

我在控制器中有一个受保护的方法,需要为它编写测试用例。方法是

def source
  @source.present? ? @source.class : Association.reflect_on_association(source.to_sym).klass
end

其中@source将是一个对象,source将是一个字符串。

我不知道如何编写此方法的测试用例。

edit

这是我正在尝试的

subject { @controller }
describe '#source' do

  let(:source_object) { create :program_type}

  describe "Object is not present" do

    it 'should reflect on association and return the reflection class' do
      subject.stubs(:source_identifier).returns("program_type")
      subject.send(:source).must_equal ProgramType
    end
  end

  describe "Object is present" do
    it 'should return the class of the object' do
      subject.send(:source).must_equal source_object.class
    end
  end

end

提前致谢。

3 个答案:

答案 0 :(得分:0)

对于测试控制器,我有以下教程作为参考

1 - http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html

2 - https://gist.github.com/delphaber/d898152eee04cea4964f(更多的是cheet sheet)

然而,在我看来,你的方法应该转移到模型或lib。 (我只是通过查看你的代码猜测)另一件事是如果你不能隔离一个测试方法,可能你可能不得不重新考虑设计:)

答案 1 :(得分:0)

一般情况下,我建议不要为受保护的控制器方法编写测试,它们应该由公开的方法调用它们来执行。

在您的情况下,只要您测试任何来电来源,您就会测试来源。

如果你真的需要,你可以做;

@controller = MyController.new
@controller.send(:source) #this will call source

答案 2 :(得分:0)

我修好了。问题是第一次测试中的返回字符串和第二次测试中的对象。这就是我要解决的问题。

describe '#source' do
  describe "Object is not present" do
    it 'should reflect on association and return the reflection class' do
      subject.stubs(:source_identifier).returns("program_types")
      subject.send(:source).must_equal ProgramType
    end
  end
  describe "Object is present" do
    it 'should return the class of the object' do
      subject.instance_variable_set(:@source, create(:program_type))
      subject.send(:source).must_equal ProgramType
    end
  end
 end