【问题标题】:How should I mock my session?我应该如何模拟我的会话?
【发布时间】:2014-01-08 00:18:37
【问题描述】:

我已经设置了一个我正在测试的控制器,这样如果会话不存在,大多数对其操作的请求都会重定向到登录页面。

因此,在单元测试中测试控制器时,我需要使用sign_in 方法。我还需要在数据库中创建用户,以便他们可以登录。

这一切都可以像这样轻松实现:

describe MyController, do
    let(:user) { FactoryGirl.create(:user)} # The 'create' creates in the database as well as in memory
    context "with session" do
        before {
            sign_in user
        }    

        context ".index" do
            assigns(:example).should == "Just an example"
        end
    end
end

但是,这不是一个好的单元测试,因为它依赖于活动记录和数据库,以及 Devise 的测试辅助方法。

那么当我尝试测试控制器时,如何使用模拟(或其他东西)来阻止控制器重定向我?

我的控制器:

class MyController < ApplicationController
    before_filter :authenticate_user!, only: [:index]

    def index
        @example = "Just an example"
    end
end

【问题讨论】:

  • 这是一个很好的自动化测试。永远不要模拟使用这样的生产代码无论如何都可以工作的东西。只模拟时钟或网络连接之类的东西。
  • 但我不应该只测试我的控制器而不是控制器规范中的其他内容吗?
  • 测试的目标是增加,而不是减少,如果你创建了一个错误,一些事情发生的几率。所以测试越多越好
  • 我同意你的功能或请求规范,但不是单位规范。

标签: ruby-on-rails rspec


【解决方案1】:

Devise Wiki 中建议的存根用户身份验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2020-03-02
    • 2012-05-11
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多