【发布时间】:2011-07-07 02:29:18
【问题描述】:
我查看了一些教程,我看到的都是关于如何测试 before_create 的旧帖子。而且似乎他们都只是在测试 before_create 被调用,即:
@user = User.new
@user.should_receive(:method_name_called_by_before_create)
@user.send(:before_create) (sometimes they just do @user.save)
我想实际测试我的方法是否有效,并且在创建记录后它已分配(并保存变量)。
这是我的模型:
用户.rb
class User < ActiveRecord::Base
has_one :character, :dependent => :destroy
after_create :generate_character
private
def generate_character
self.create_character(:name => "#{email}'s avatar")
end
end
和character.rb
class Character < ActiveRecord::Base
belongs_to :user
before_create :generate_character
private
def generate_character
response = api_call
#API CALL HERE
#set object attributes here
self.stat1 = calculate_stat1(response) + 5
self.stat2 = calculate_stat2(response) + 5
self.stat3 = calculate_stat3(response) + 5
end
def api_call
return api_call_response
end
end
我想测试生成字符是否确实设置了属性而无需上网并调用 API 调用。这可能与 rspec 吗?我有一个 json 响应的固定装置,所以我希望我可以存根生成字符,然后使用假响应进行测试。
这是我的 character.spec:
describe Character do
before(:each) do
Character.any_instance.stub!(:api_call).and_return(fake_response.read)
@user = Factory(:user)
@character = @user.character
puts @character.inspect
end
def fake_response
File.open("spec/fixtures/api_response.json")
end
它只为每个角色的统计数据打印 5 个。我还在 character.rb 的 generate_character 方法中做了一个puts response,它仍然打印出“真实”的 api 调用。
我设法在 fake_response 中进行了 put,它确实通过了那里,但之后它也通过了“真实的”api_call,这使得存根过时了。我该如何度过这个难关?
【问题讨论】:
标签: activerecord callback rspec