【发布时间】:2014-02-18 23:43:57
【问题描述】:
我在测试控制器时遇到了 Rails 4.0.3 和 rspec 2.14.1 的问题。
控制器的相关部分是:
class LoginsController < ApplicationController
def sign_in
@user = User.find_by(email: params[:email])
# ... - a few other codepaths but nothing that looks for primary_phone
if params[:email]
@user.send_token
flash[:notice] = "blah blah"
end
end
User.rb 是:
class User < ActiveRecord::Base
# ...
def send_token
raise 'Tried to send token to contact with no phone number' if primary_phone.nil?
SMSSender.sms(primary_phone,"Your login code is: #{generate_token}")
end
end
规格是:
require 'spec_helper'
describe LoginsController do
it "sends a token if a valid email is provided" do
@u = create(:user, primary_phone: "abc")
User.any_instance.should receive(:send_token)
post 'sign_in', email: @u.email
end
end
还有,我的用户工厂:
FactoryGirl.define do
factory :user do
name "MyString"
email "a@b.com"
end
end
当我将规范的@u = create 行更改为@u = create(:user)(即省略primary_phone)时,我得到:
Failure/Error: post 'sign_in', email: @u.email
RuntimeError:
Tried to send token to contact with no phone number
# ./app/models/user.rb:16:in `send_token'
# ./app/controllers/logins_controller.rb:19:in `sign_in'
# ./spec/controllers/logins_controller_spec.rb:14:in `block (3 levels) in <top (required)>'
这符合预期。当我将其改回以包含 primary_phone 时,我得到:
1) LoginsController sign_in sends a token if a valid email is provided
Failure/Error: User.any_instance.should receive(:send_token)
(#<RSpec::Mocks::AnyInstance::Recorder:0x007ff537ed4bd8>).send_token(any args)
expected: 1 time with any arguments
received: 0 times with any arguments
# ./spec/controllers/logins_controller_spec.rb:14:in `block (3 levels) in <top (required)>'
无法理解为什么该更改会阻止规范通过。我确实在规范中的“帖子”之后附加了一个调试器,并查看了闪存是否正确(即,确保控制器中的正确代码树正在运行)并且是正确的。
【问题讨论】:
标签: ruby-on-rails rspec controller functional-testing