ruby-on-rails - 集成测试 : create vs new in controller

标签 ruby-on-rails testing tdd integration-testing

已编辑:遵循建议。请参阅问题末尾。

我有一个具有两个功能的 Controller :

 def new
     if login_required
            @discussion = Discussion.new
            respond_to do |format|
                  format.html # new.html.erb
                  format.xml  { render :xml => @discussion }
            end
      end
 end


 def create
     if login_required
         @discussion = Discussion.new(params[:discussion])
         @discussion.update_attribute("user_id",session[:userid])
         respond_to do |format|
         if @discussion.save
            flash[:notice] = 'Discussion was successfully created.'
            format.html { redirect_to(@discussion) }
            format.xml  { render :xml => @discussion, :status => :created, :location => @Discussion }
        else
            format.html { render :action => "new" }
            format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
        end
   end
 end
end

现在,在我的集成测试文件中我有:

test "test 1" do  
   post "/users/login",:user=> { :name => "bob", :password => "test_pass" }
   post "/discussions/create", :discussion => { :title => "title 1", :body => "discussion body", :id => "101"} #Create 1
   assert_response :success       #Assert 1
   get "/discussions/101"
   assert_response :success       #Assert 2
end

但是,我在 Assert 1 上得到了 302

如果我将“Create 1”更改为: post "/discussions/new", :discussion => { :title => "标题 1", :body => "讨论正文", :id => "101"}

我收到 404 错误。

1) 发生了什么事?

2) 我可以使用哪些工具/选项以便我自己解决这个问题?

谢谢

更新

遵循建议(来自 Ryan Bigg):

  • post :create, { :discussion => { } }, { :user_id => users(:bob).id }

结果:

  • Rack::Lint::LintError:环境变量 HTTP_USER_ID 具有非字符串值 1976283457

仍未解决。

最佳答案

一些事情:

  1. 尝试将 login_required 移动到 before_filter
  2. 对于您的测试,您应该执行 post :create, :discussion => { ... }。如果您设置正确,测试应该已经知道 Controller 。我相信命名约定是 DiscussionsControllerTest 我的头脑。

我认为您为什么在 Assert 1 上收到 302 是因为它实际上并未登录。尝试在对 post 的调用中传递凭据:

post :create, { :discussion => { } }, { :user_id => users(:bob).id }

post 的第二个参数是参数 Hash,第三个参数是 session Hash。假设您已经加载了用户固定装置并且他们有一个名为 bob 的 key ,这应该会找到并使用他登录。

我在我的 RSpec 测试中使用的替代解决方案是定义一个 login_as 方法,它接受我应该登录的用户的登录名的单个参数。然后我在 Controller 中执行的每个请求或集成测试都以该用户身份登录:

def login_as(name)
  request.session[:user] = users(name).id
end

我认为您应该能够在您的 test_helper.rb 文件中执行相同的操作,但是...我还没有尝试过。 YMMV.

关于ruby-on-rails - 集成测试 : create vs new in controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1983633/

相关文章:

c# - 如何编写 nUnit/Moq 来测试通用扩展方法?

javascript - 在 TS 中使用 Jest 模拟分割分析

ruby-on-rails - 为 rails 中的特定 Controller 跳过/禁用 force_ssl

ruby-on-rails - rails form_tag url 路径

ruby-on-rails - 在依赖对象中使用来自另一个对象的元素形成帮助程序选择标签

java - Junit 之前/之后和设置/拆卸

ruby-on-rails - FactoryGirl 记录未保存

ruby-on-rails - Factory Girl 正在错误的路径中寻找 factories.rb

angularjs - Protractor 覆盖 "beforeAll"http mock

.net - VB.NET 和 NUnit - TDD