提问人:morris menanya 提问时间:10/9/2023 更新时间:10/11/2023 访问量:30
编写简单的RSpec模型测试
Writing simple RSpec model test
问:
我正在尝试为 RSpec 编写一个简单的用户模型测试。我已经安装了与此相关的所有必要 gem,但是当我尝试运行这个简单的测试代码时
# spec/models/user_spec.rb
RSpec.describe User, type: :model do
subject {User.new(first_name: "jon", last_name: "doe", email: "[email protected]")}
before {subject.save}
it 'first name should be presentt' do
subject.title = nil
expect(subject).to_not be_valid
end
it 'last name should be present' do
subject.last_name = nil
expect(subject).to_not be_valid
end
end
我在控制台中收到此错误
An error occurred while loading ./spec/models/user_spec.rb.
Failure/Error:
subject.title = nil
expect(subject).to_not be_valid
end
NameError:
uninitialized constant User
# ./spec/models/user_spec.rb:2:in `<top (required)>'
No examples found.
答:
0赞
max
10/11/2023
#1
为了让 Rails 为你自动加载常量,你需要这样做。require 'rails_helper'
此外,规范完全被打破了。假设你有这个模型:
class User < ApplicationRecord
validates :first_name, presence: true
validates :last_name, presence: true
end
而这个规格:
require 'rails_helper'
RSpec.describe User, type: :model do
subject {User.new(first_name: "jon", last_name: "doe", email: "[email protected]")}
before { subject.save }
# ...
it 'last name should be present' do
subject.last_name = nil
expect(subject).to_not be_valid
end
end
它实际上不起作用,因为您正在触发验证,除非您实际再次触发验证,否则什么都不做。before { subject.save }
subject.last_name = nil
即使你解决了这个问题,规范本身实际上也是无用的,因为它会给出误报。
require 'rails_helper'
RSpec.describe User, type: :model do
subject(:user) { User.new(first_name: "jon", last_name: "doe", email: "[email protected]") }
it 'last name should be present' do
user.last_name = nil
user.valid?
expect(user).to_not be_valid
end
end
运行这个规范,它会告诉你一切都很好。然后注释掉 - 当你再次运行规范时,你会认为它应该失败,因为不再需要姓氏。但由于模型中的其他验证,它仍然通过!validates :last_name, presence: true
如果要进行单元测试验证,则测试实际验证。
require 'rails_helper'
RSpec.describe User, type: :model do
# see http://blog.davidchelimsky.net/blog/2012/05/13/spec-smell-explicit-use-of-subject/
subject(:user) { User.new }
# you just need to trigger the validations - not save it
before { user.valid? }
it 'requires a last name' do
expect(user.errors[:last_name]).to_include "can't be blank"
end
end
希望通过集成测试一次涵盖所有验证。
我强烈推荐 should've-matchers,它使测试验证的重复性大大降低。
评论
require 'rails_helper'