除了运行单个it
块时,我的规范运行没有问题。在这种情况下,我得到一个Failure/Error: before(:context)
的解释:
使用rspec-mocks之外的双打或部分双打 不支持每次测试生命周期。从rspec-mocks使用
stub
未明确启用语法的旧:should
语法是 不推荐使用。使用新的:expect
语法或显式启用 改为:should
。
问题是我不使用rspec-mocks
stub
方法,而是使用dry-container
定义的方法:
像这样:
require 'dry/container/stub'
before { FooContainer.enable_stubs! }
before(:context) { FooContainer.stub 'foo.key', stubbed_operation }
after(:context) { FooContainer.unstub 'foo.key' }
是否可以在不启用旧的rspec-mocks
语法的情况下禁用此RSpec行为?
rspec --version
RSpec 3.8
- rspec-core 3.8.0
- rspec-expectations 3.8.2
- rspec-mocks 3.8.0
- rspec-rails 3.8.2
- rspec-support 3.8.0
rails -v
Rails 5.2.2.1
ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
dry-container (0.6.0)
答案 0 :(得分:1)
如果使用,我现在找到了一种解决方法:
before { FooContainer.stub 'foo.key', stubbed_operation }
after { FooContainer.unstub 'foo.key' }
代替:
before(:context) { FooContainer.stub 'foo.key', stubbed_operation }
after(:context) { FooContainer.unstub 'foo.key' }
有效。我看到的唯一缺点是,它会降低性能,并且将来可能会失效。
答案 1 :(得分:1)
我认为问题在于,您在before(:each)
块中而不是before(:context)
块中执行了before(:each)
块中的存根。此时,rspec / ruby未知stub
的{{1}}方法,因此它尝试使用dry-container
中的默认stub
方法。
rspec-mock
从dry-container testing documentation
require 'dry/container/stub'
before(:context) { FooContainer.enable_stubs! }
before(:context) { FooContainer.stub 'foo.key', stubbed_operation }
# or better
before(:context) do
FooContainer.enable_stubs!
FooContainer.stub 'foo.key', stubbed_operation
end
after(:context) { FooContainer.unstub 'foo.key' }
context "my context" do
it "my test" do
...
end
end