我在控制器中有一个受保护的方法,需要为它编写测试用例。方法是
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
提前致谢。
答案 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