这个问题可能看起来像这个问题的重复,但接受的答案对我的问题没有帮助。
语境
由于 Rails 5 不再支持在控制器测试中直接操作会话(现在继承自 ActionDispatch::IntegrationTest),因此我将走上模拟和存根的黑暗道路。
我知道这是不好的做法,并且有更好的方法来测试控制器(我确实理解他们转向集成测试),但我不想运行完整的集成测试并在单个测试中调用多个操作只是为了设置一个特定的会话变量。
设想
使用Mocha模拟/存根会话变量实际上非常容易:
ActionDispatch::Request::Session.any_instance.stubs(:[]).with(:some_variable).returns("some value")
问题是,Rails 在会话中存储了很多东西(只需session.inspect
在您的一个视图中的任何地方做一个)并且存根该:[]
方法显然会阻止访问它们中的任何一个(因此session[:some_other_variable]
在测试中将不再起作用)。
问题
:[]
有没有办法仅在使用特定参数调用时存根/模拟该方法,并使所有其他调用不被存根?
我本来希望像
ActionDispatch::Request::Session.any_instance.stubs(:[]).with(:some_variable).returns("some value")
ActionDispatch::Request::Session.any_instance.stubs(:[]).with(anything).returns(original_value)
但我找不到完成它的方法。