我正在尝试编写一些 RSpec 测试来测试我的应用程序,但我偶然发现了几个问题,但我找不到任何解决方案。
1)我正在尝试测试更新操作。这是我的代码:
it "email is a new one" do
put :update, id: @user, user: FactoryGirl.attributes_for(:user, :email=>"[email protected] /cdn-cgi/l/email-protection")
@user.reload
@user.email.should == "[email protected] /cdn-cgi/l/email-protection"
puts @user.email
end
这是 UsersController 更新操作:
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to edit_user_path(@user), :notice => "Your settings were successfully updated."}
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
这是错误:
Failure/Error: @user.email.should == "[email protected] /cdn-cgi/l/email-protection"
expected: "[email protected] /cdn-cgi/l/email-protection"
got: "[email protected] /cdn-cgi/l/email-protection" (using ==)
很明显,测试没有更改用户的电子邮件。
我从这里获取了更新操作教程:http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html。
我在哪里可以找到解决方案?
Could @user.update_attributes(params[:user])
由于验证原因而失败?
此外,您还可以确保您的测试和控制器方法与同一个 ruby 对象进行交互。这对我来说是过去的一个难题。我这样做的方法是存根find
类上的方法。
it "email is a new one" do
User.stubs(:find).returns(@user)
put :update, id: @user, user: FactoryGirl.attributes_for(:user, :email=>"[email protected] /cdn-cgi/l/email-protection")
@user.reload
@user.email.should == "[email protected] /cdn-cgi/l/email-protection"
puts @user.email
end
这确保您在测试期间不仅谈论相同的记录,而且谈论相同的对象。
最后,我想说你的测试对你很有帮助。你基本上是在测试update_attributes
,这是一个核心功能,并且已经经过彻底测试。我会专注于测试控制器的行为。像这样的事情:
let(:user) { FactoryGirl.create(:user) }
describe "PUT #update" do
before(:each) {
User.stubs(:find).returns(user)
}
it "should redirect to the user path on succesful save" do
user.should_receive(:update_attributes).and_return true
put :update, user, {}
response.should redirect_to(edit_user_path(user))
end
it "should render the edit screen again with errors if the model doesn't save" do
user.should_receive(:update_attributes).and_return false
put :update, user, {}
response.should render_template("edit")
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)