gpt4 book ai didi

ruby - Rspec 限制方法的重用

转载 作者:行者123 更新时间:2023-12-04 08:00:24 25 4
gpt4 key购买 nike

Ruby 和 RSpec 的新手,所以请保持温和。
我来自 Python 世界,特别是 pytest。您可以在 pytest 中做的一件事是在您的测试和其他 fixture 中使用 fixture 。在一个非常简单的例子中,假设我们有一个 create fixture 和 delete需要 create 的 fixture .如果我们有一个同时使用 create 的测试和 delete固定装置, create只会被调用一次(即使 delete 使用 create ,pytest 知道它已经被调用用于测试用例。这是一些示例 python 代码:

# test_fixture_reuse.py
import pytest

@pytest.fixture
def create_something():
"""Create tester object"""
#return MyTester(request.param)
print ("created_something")


@pytest.fixture
def delete_something(create_something):
"""Create tester object"""
#return MyTester(request.param)
print ("delete_something")


class TestIt:
def test_only_create(self, create_something):
print ("in test_only_create")
assert 1

def test_create_and_delete(self, create_something, delete_something):
print ("in test_create_and_delete")
assert 1

def test_only_delete(self, delete_something):
print ("in test_only_delete")
assert 1
运行 pytest -v test_fixture_reuse -s按预期返回此输出:
test_parameterized_fixture.py::TestIt::test_only_create created_something
in test_only_create
PASSED
test_parameterized_fixture.py::TestIt::test_create_and_delete created_something
delete_something
in test_create_and_delete
PASSED
test_parameterized_fixture.py::TestIt::test_only_delete created_something
delete_something
in test_only_delete
PASSED
根据我在 Ruby 中的尝试,没有与 fixture 等效的概念。这意味着每个测试都需要控制调用流。所以如果我们测试删除,测试需要调用 create ,然后调用 delete , 但是 deletecreate 没有显式依赖. RSpec 中的 Fixtures 通常似乎映射到模型,因此大多数搜索结果是不相关的。
我的问题是 - 我怎样才能在 RSpec 中做类似于上面的 python 代码的事情?或者这是因为 Python 经验而让我过于拘泥于我的观点的事情之一,并且在 RSpec 中有一种类似的做事方式,我没有正确搜索?

最佳答案

在 RSpec 中,我们使用 let对于记忆化的辅助方法,如下所示:

RSpec.describe("my tests") do
let(:created_record) { MyRecord.create }

# using tap here to return the deleted record from the block
let(:destroyed_record) { created_record.tap(&:destroy) }

it("can create record") { created_record }
it("can destroy record") { destroyed_record }
it("memoizes created_record if called twice") { created_record; destroyed_record }
end
let调用在您第一次在测试中引用它们之前不会运行,并在该测试用例中使用缓存的结果进行后续调用。 “测试用例”是指 it堵塞。如果您希望这些方法在每个测试用例开始时自动执行(无需显式调用该方法),您可以使用 let!反而。结果仍将被缓存以供后续调用。见 https://relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/let-and-let
也值得一读 subject https://relishapp.com/rspec/rspec-core/v/3-10/docs/subject也是。
如果你想要一个普通的、未缓存的方法,你只需要写一个常规的 def .. end .见 https://relishapp.com/rspec/rspec-core/v/3-10/docs/helper-methods/arbitrary-helper-methods
另一件事,Rails 领域中的术语“fixture”有一些特定的含义,它通常意味着您从 YAML 文件或类似文件加载数据库状态(参见 https://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures )......这是相反的到“工厂”,它更容易使用,但速度也慢得多(参见 https://github.com/thoughtbot/factory_bot,这是最常见的制造工厂的库)。

关于ruby - Rspec 限制方法的重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66507898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com