gpt4 book ai didi

ruby-on-rails - Rails Rspec 模型规范用户:电子邮件 ActiveRecord::RecordInvalid

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:49 26 4
gpt4 key购买 nike

试图找出我的 rspec 测试失败的原因。最值得注意的是看起来自相矛盾的失败消息。声明我有一个 ActiveRecord::RecordInvalid 错误,这正是我断言应该发生的事情。

这是我的 user.rb

...
validates_presence_of :email
...

这是我的 users_spec.rb

...
it "is invalid without email" do
Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
end
...

这是输出:

Failures:

1) User a user (in general) is invalid without email
Failure/Error: Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
ActiveRecord::RecordInvalid:
Validation failed: Email is invalid, Email can't be blank
# ./spec/models/user_spec.rb:34:in `block (3 levels) in <top (required)>'

最初我是这样测试的,但它一直失败,所以我决定具体说明我期望的错误。

it "is invalid without email" do 
Factory(:user, email: nil).should_not be_valid
end

最佳答案

您的代码不起作用的原因是您在实际测试其有效性之前试图创建一个无效模型。你想要做的是创建一个有效的模型,改变一些东西并检查它是否无效,就像这样:

it "is invalid without email" do 
user = Factory(:user)
user.email = nil
user.should_not be_valid
end

我个人喜欢在 before block 中定义我的模型,将其设置为 subject 然后更改每个规范中的属性并检查有效性,如下所示:

before do
@user = FactoryGirl.create(:user)
end

subject { @user }

it "is invalid without email" do
subject.email = nil
should_not be_valid
end

郑重声明,如果您想测试记录创建是否引发错误(这绝对不是建议的方法),您可以通过包装 Factory 来完成lambda 中调用,如下所示:

lambda {
Factory(:user, :email => nil)
}.should raise_error(ActiveRecord::RecordInvalid)

关于ruby-on-rails - Rails Rspec 模型规范用户:电子邮件 ActiveRecord::RecordInvalid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11854674/

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