RSpec 测试 PUT 更新操作

2023-12-24

我正在尝试编写一些 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(使用前将#替换为@)

RSpec 测试 PUT 更新操作 的相关文章

随机推荐

  • AngularJS - 如何从控制器中的 ng-repeat 访问下一个项目

    我想在单击按钮时访问屏 幕上下一个项目的参数 我在 html 文件中使用 ng repeat li a href img src xxx jpg a li 我的控制器中的索引带有循环 scope itemNext function scop
  • 如何在 Jetpack Compose 中的路径上绘制文本?

    现在有没有办法使用 jetpack compose 在自定义路径上写入文本 这是我想要实现的目标的示例图像 We use nativeCanvas使用绘制文本Path在 Compose 中 就像我们通常在自定义视图中所做的那样 Ex Com
  • jQuery 没有为 Angular 2 定义

    我正在尝试使用 ng2 datetime 但是 当我按照说明安装 npm install save ng2 datetime 时 出现以下错误 我尝试运行以下 npm install 但它没有修复任何问题 npm install jquer
  • Emacs shell 脚本 - 如何将初始选项放入脚本中?

    受到堆栈溢出问题的启发Emacs 中惯用的文本批处理 https stackoverflow com questions 2879746 idomatic batch processing of text in emacs我尝试了一个 Em
  • 可以将父版本作为属性提供给子项吗?

    这是关于 Maven POM 的 如果我想让我的父版本也成为我的依赖项的版本 我必须设置一个属性 其值为 project parent version 当我的主 POM 的子级 其中有 project parent version 属性 因
  • 使用 Python/M2Crypto 进行 SAML 签名验证

    我正在尝试使用 M2Crypto 来验证从我的 django python 应用程序中的 SSO SAML 提供程序返回的 XML 响应中包含的签名 但我似乎无法让它工作 我的 XML 响应看起来有点像第二个示例here http www
  • 修改程序文本时ptrace POKETEXT如何工作?

    它是否绕过了跟踪进程的只读页面权限 还是需要临时更改权限才可写 如果是这种情况 权限更改对跟踪的进程可见吗 看着内核源代码 https git kernel org pub scm linux kernel git torvalds lin
  • 从单元测试项目启动并调用 WPF 应用程序上的方法

    我想启动一个 WPF 应用程序并调用 ViewModel 上的方法来控制该应用程序以进行集成测试 就像是 Test public void Test1 var application new MyApp application Initia
  • IIS 7.5 上的 Asp.net 4.0 中的会话超时

    我想将我的 Web 应用程序的超时设置为 12 小时 我已经在 web config 文件中进行了设置
  • 如何完全更改网址而不将页面重新加载到新网址?

    我已经解决了这里提出的许多关于更改网址而不重新加载的问题 虽然我尝试了几乎所有的方法 但我无法在不重新加载新页面的情况下完全更改页面的 url 包括其域名部分 我怎样才能做到这一点 这是不可能的 有充分的理由 您可以在这里获取更多相关信息
  • 为什么Perl的系统返回值不是我所期望的?

    让我首先解释一下我想要实现的目标 本质上有两个 Perl 脚本 一种是我所说的带有 UI 的主脚本 运行此脚本的用户将看到他可以从菜单调用的其他脚本的列表 该列表是通过自定义配置文件加载的 主脚本的目的是能够在将来根据需要添加其他脚本 而无
  • 我应该将费用/折扣列表合并到订单类别中还是将它们作为商品行

    我没有其他开发人员可以寻求建议或 你觉得怎么样 我在想this 所以 如果您有时间 请阅读并告诉我您的想法 显示比描述更容易 但该应用程序本质上就像一个销售点应用程序 由 3 个主要部分组成 商品 订单商品和订单 项目类是来自数据存储区的数
  • 使用行号更新 Oracle 表列

    我想用行号更新表列 中的每一行empid列应使用相关行号进行更新 我尝试了以下查询 UPDATE employee SET empid row number 但这是行不通的 任何想法 首先 这不是正确的语法row number 功能 因为你
  • sql server单行多列合并为一列

    我有这样的桌子 Reg No Student Name Subject1 Subject2 Subject3 Subject4 Total 101 Kevin 85 94 78 90 347 102 Andy 75 88 91 78 332
  • C# 中的分号

    为什么 C 中每行末尾都需要分号 为什么编译器不能知道每一行的结束位置 行终止符将使您能够将语句分成多行 另一方面 像 VB 这样的语言有一个行继续符 并且可能会引发分号的编译错误 我个人认为用分号终止语句比继续使用下划线要干净得多 最后
  • SilverStripe 3 - <%循环%>的选项

    是否有我可以添加到循环中的所有选项的列表 我不知道选项是否是正确的名称 我的意思是这些 有人可以告诉我这里可能发生的一切吗 它的正确名称是什么 你的问题有一个错误 是 or 看 您正在循环 DataObject 列表 well loop基本
  • 为什么比较 constexpr 函数的两个参数不是静态断言的常量条件?

    constexpr uint32 t BitPositionToMask int i int Size static assert i lt Size bit position out of range return 1 lt lt i 这
  • kubectl 端口转发失败

    我正在裸机 RHEL7 上运行 k8s 集群 我正在尝试运行 kubectl port forward 命令并收到错误 kubectl port forward p somepod 10000 8080 I0128 15 33 33 802
  • 从 powershell 调用 vcvarsall.bat 后运行构建脚本

    我正在尝试运行 Visual Studio 开发人员 cmd 提示符 环境变量设置批处理文件 然后运行 Powershell 脚本中的构建脚本 如下所示 cmd v on k C Program Files x86 Microsoft Vi
  • RSpec 测试 PUT 更新操作

    我正在尝试编写一些 RSpec 测试来测试我的应用程序 但我偶然发现了几个问题 但我找不到任何解决方案 1 我正在尝试测试更新操作 这是我的代码 it email is a new one do put update id user use