ruby – 如何重置模拟类方法的期望?
发布时间:2020-12-17 02:41:07 所属栏目:百科 来源:网络整理
导读:对不起,如果这很简单.我是 ruby以及rspec的新手,似乎rspec是一个非常“模糊”的世界(特别是来自.net背景时). 在我的’规范’中,我有: before(:each) do expect(File).to receive(:exist?).with("dummy.yaml").and_return (true)end 这适用于我的所有“示例
对不起,如果这很简单.我是
ruby以及rspec的新手,似乎rspec是一个非常“模糊”的世界(特别是来自.net背景时).
在我的’规范’中,我有: before(:each) do expect(File).to receive(:exist?).with("dummy.yaml").and_return (true) end 这适用于我的所有“示例”,除了我希望它返回false的一个. expect(File).to receive(:exist?).with("non_existent.yaml").and_return (false) 这显然无法通过我的测试,因为虽然满足了“non_existent.yaml”的期望,但“dummy.yaml”却不是: (<File (class)>).exist?("dummy.yaml") expected: 1 time with arguments: ("dummy.yaml") received: 0 times 那么如何在“File.exist”上进行“重置”? (一个类方法模拟)在我设置它的新期望之前? (…“non_existent.yaml”..) 我用Google搜索并且它产生了: RSpec::Mocks.proxy_for(your_object).reset 但这给了我: NoMethodError: undefined method `proxy_for' for RSpec::Mocks:Module 解决方法
我在文档中的任何地方都找不到这是你应该怎么做的,过去的行为表明这个解决方案将来也可能会改变,但显然这就是你现在可以做到的:
RSpec::Mocks.space.proxy_for(your_object).reset 不过,我会关注@ BroiSatse的评论,并考虑重新设计测试,旨在将期望从前一块移开.正如您所说,前面的块用于设置,并且设置是一个非常奇怪的地方,以达到期望. 我不确定你是如何选择这种设计的,但我可以提出两种可能的选择: >如果测试是微不足道的,并且无论如何都会有效,那么你应该用这个明确的期望创建一个测试,同时将其存入其他测试: before(:each) do allow(File).to receive(:exist?).with("dummy.yaml").and_return (true) end it "asks if file exists" do expect(File).to receive(:exist?).with("dummy.yaml").and_return (true) # do the test... end >如果期望应该针对每个测试运行,因为每个场景中的更改是上下文,您应该考虑使用shared examples: shared_examples "looking for dummy.yaml" do it "asks if file exists" do expect(File).to receive(:exist?).with("dummy.yaml").and_return (true) # do the test... end end it_behaves_like "looking for dummy.yaml" do let(:scenario) { "something which sets the context"} end 如果有更多推荐/记录的解决方案来重置模拟对象,您可能还需要ask myron … (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |