d11*_*wtq 3 ruby rspec ruby-on-rails datamapper
RSpec总是坚持使用基于xUnit的测试框架,但我有点迷失了,但我还是试着去了.
编写规范的方式的嵌套特性给我带来了一些令人头疼的关于我应该在哪里进行数据库设置/拆解.
根据DatabaseCleaner自述文件:
Spec::Runner.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Run Code Online (Sandbox Code Playgroud)
现在我不能使用事务,因为我在我的代码中使用它们,所以我只是坚持截断,但那不应该在这里或那里.
我有这个:
RSpec.configure do |config|
config.mock_with :rspec
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当我尝试在后续或块中使用它时,我在一个subject或let块中创建的任何装置已经消失(从数据库中).describeit
例如(使用Machinist创建灯具......但这不应该相关):
describe User do
describe "finding with login credentials" do
let(:user) { User.make(:username => "test", :password => "password") }
subject { User.get_by_login_credentials!("test", "password") }
it { should == user }
end
end
Run Code Online (Sandbox Code Playgroud)
我正在努力解决我应该如何嵌套这些describe和subject其他块,所以也许这是我的问题,但基本上这会失败,因为当它试图从数据库中获取用户时,它已被删除,因为after(:each)钩子是调用,大概是在let?之后?
如果你要使用subject和let在一起,你需要了解他们是如何/时调用.在这种情况下,subject在user生成方法之前调用let.问题不是在subject调用之前从db中删除了对象,而是在该点甚至没有创建它.
如果您使用该let!方法,您的示例将起作用,该方法添加了一个before钩子,该钩子user在示例之前隐式调用该方法(因此在subject调用之前).
也就是说,我建议你停止挣扎并使用RSpec已经暴露的更简单的API:
describe User do
it "finds a user with login credentials" do
user = User.make(:username => "test", :password => "password")
User.get_by_login_credentials!("test", "password").should eq(user)
end
end
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎更简单.
| 归档时间: |
|
| 查看次数: |
2950 次 |
| 最近记录: |